亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

重寫document.write實現無阻塞加載js廣告(補充)

2019-11-20 13:45:30
字體:
來源:轉載
供稿:網友

無阻塞加載javascript,對于頁面性能優化有很大的作用,這樣能有效的減少js對頁面加載的阻塞。特別是一些廣告js文件,由于廣告內容有可能是富媒體,更是很可能成為你頁面加載提速的瓶頸,高性能javascript告訴我們,同學,提升你的網頁速度,就無阻塞地加載JS吧。

于是便有一下代碼出現。

(function() {var s = document.createElement('script');s.type = 'text/javascript';s.async = true;s.src = 'http://yourdomain.com/script.js';var x = document.getElementsByTagName('script')[0];x.parentNode.insertBefore(s, x);})();

上邊都是大家熟悉的,看過書的同學都知道這樣無阻塞加載的好處,效果挺不錯的,當此等無阻塞腳本遇到一般js廣告就來了寫問題――廣告代碼出現在HTML里面了卻不顯示廣告。

納尼?HTML出來了不渲染到頁面上?

先看看廣告js代碼

復制代碼 代碼如下:

document.write('<img src="http://img.VeVB.COm/logo_small.gif" alt="Logo">');

代碼挺簡單就一個document.write輸出HTML代碼(相信很多廣告商的廣告都這樣),頁面不顯示廣告問題在哪里呢? 問題就在這個document.write。為什么?先w3schools看看document.write的定義很使用吧。

定義和用法
write() 方法可向文檔寫入 HTML 表達式或 JavaScript 代碼。
可列出多個參數(exp1,exp2,exp3,...) ,它們將按順序被追加到文檔中。

方法:
一是在使用該方在文檔中輸出 HTML,另一種是在調用該方法的的窗口之外的窗口、框架中產生新文檔。在第二種情況中,請務必使用 close() 方法來關閉文檔。

但其原理是在頁面流輸入過程中執行,一旦頁面加載完畢,再次調用 document.write(),會隱式地調用 document.open() 來擦除當前文檔并開始一個新的文檔。也就是說如果在HTML加載完后我們再使用document.write會檫除之前生成html,而顯示document.write輸出的內容。

而我們例子中在頁面加載完后在在html中輸出document.write,就不會被執行了。問題知道了,原理知道了,那怎么解決這個問題呢?

異步利用ajax,行不同,很多廣告文件都是第三方的,在不同域名下,存在跨域問題,而且不能我們控制其代碼的輸出。在這種情況下我們想到了一個辦法就是重寫掉document.write,在js文件加載結束后再把document.write重寫回去。看代碼。

第一版本無阻塞加載js廣告:

function LoadADScript(url, container, callback){    this.dw = document.write;    this.url = url;    this.containerObj = (typeof container == 'string'?document.getElementById(container):container);    this.callback = callback || function(){};  }    LoadADScript.prototype = {    startLoad: function(){      var script = document.createElement('script'),        _this = this;            if(script.readyState){ //IE        script.onreadystatechange = function(){        if (script.readyState == "loaded" || script.readyState == "complete"){          script.onreadystatechange = null;          _this.finished();        }      };      }else{ //Other        script.onload = function(){          _this.finished();        };      }            document.write = function(ad){        var html = _this.containerObj.innerHTML;        _this.containerObj.innerHTML = html + ad;      }            script.src = _this.url;      script.type = 'text/javascript';      document.getElementsByTagName('head')[0].appendChild(script);    },    finished: function(){      document.write = this.dw;      this.callback.apply();    }  };

頁面調用代碼:

var loadScript = new LoadADScript('ad.js','msat-adwrap',function(){ console.log('msat-adwrap'); });  loadScript.startLoad();    var loadScript = new LoadADScript('ad2.js','msat-adwrap',function(){ console.log('msat-adwrap2'); });  loadScript.startLoad();    var loadScript = new LoadADScript('ad3.js','msat-adwrap',function(){ console.log('msat-adwrap3'); });  loadScript.startLoad();

廣告js代碼

//ad.jsdocument.write('<img src="http://images.cnblogs.com/logo_small.gif" alt="Logo">');//ad2.jsdocument.write('<img src="http://www.baidu.com/img/baidu_sylogo1.gif" width="270" height="129" usemap="#mp">');//ad3.jsdocument.write('<img alt="Google" height="95" id="hplogo" src="http://www.google.com/images/srpr/logo3w.png" width="275">');

第一版本的問題是在多個文件調用的時候,會出現一些問題:

1. 由于文件加載的速度不一樣,導致可能有些先加載有些后加載,也就是無序的,而且很多時候我們需要的是有序的。比如我們需要先加載第一屏的廣告。

2. 想有些廣告需要前置設置一些參數的,例如google adsense

為了解決這兩個問題好進一步修改成最終無阻塞加載js版本。

HTML頁面代碼:

<!DOCTYPE html><html lang="en">  <head>    <meta charset="utf-8" />    <title>new_file</title>    <script type="text/javascript" src="loadscript.js"></script>  </head><body><div id = "msat-adwrap"></div><div id = "msat-adwrap2"></div><script type="text/javascript">  loadScript.add({    url:'ad.js',    container: 'msat-adwrap',    callback:function(){ console.log('msat-adwrap'); }  }).add({    url:'ad2.js',    container: 'msat-adwrap2',    callback:function(){ console.log('msat-adwrap2'); }  }).add({//google adsense    url:'http://pagead2.googlesyndication.com/pagead/show_ads.js',    container: 'msat-adwrap',    init: function(){      google_ad_client = "ca-pub-2152294856721899";      /* 250x250 rich */      google_ad_slot = "3929903770";      google_ad_width = 250;      google_ad_height = 250;    },    callback:function(){ console.log('msat-adwrap3'); }  }).execute();</script></body></html>

loadscript.js源代碼

/** * 無阻塞加載廣告 * @author Arain.Yu */var loadScript = ( function() {  var adQueue = [], dw = document.write;  //緩存js自身的document.write  function LoadADScript(url, container, init, callback) {    this.url = url;    this.containerObj = ( typeof container == 'string' ? document.getElementById(container) : container);    this.init = init ||    function() {    };    this.callback = callback ||    function() {    };  }  LoadADScript.prototype = {    startLoad : function() {      var script = document.createElement('script'), _this = this;      _this.init.apply();      if(script.readyState) {//IE        script.onreadystatechange = function() {          if(script.readyState == "loaded" || script.readyState == "complete") {            script.onreadystatechange = null;            _this.startNext();          }        };      } else {//Other        script.onload = function() {          _this.startNext();        };      }      //重寫document.write      document.write = function(ad) {        var html = _this.containerObj.innerHTML;        _this.containerObj.innerHTML = html + ad;      }      script.src = _this.url;      script.type = 'text/javascript';      document.getElementsByTagName('head')[0].appendChild(script);    },    finished : function() {      //還原document.write      document.write = this.dw;    },    startNext : function() {      adQueue.shift();      this.callback.apply();      if(adQueue.length > 0) {        adQueue[0].startLoad();      } else {        this.finished();      }    }  };  return {    add : function(adObj) {      if(!adObj)        return;      adQueue.push(new LoadADScript(adObj.url, adObj.container, adObj.init, adObj.callback));      return this;    },    execute : function() {      if(adQueue.length > 0) {        adQueue[0].startLoad();      }    }  };}());
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
4k岛国日韩精品**专区| yw.139尤物在线精品视频| 久久国产精品久久久久久| 欧美色播在线播放| 在线不卡国产精品| 欧美放荡办公室videos4k| 日韩在线欧美在线国产在线| 欧美午夜片欧美片在线观看| 午夜精品久久久久久久99热浪潮| 日韩av不卡电影| 色爱精品视频一区| 欧美大尺度在线观看| 国产精品久久国产精品99gif| 日韩视频在线免费观看| 97人人爽人人喊人人模波多| 98精品国产高清在线xxxx天堂| 亚洲精品乱码久久久久久按摩观| 欧美高清电影在线看| 精品国产91久久久| 欧美在线视频a| 超碰日本道色综合久久综合| 亚洲精品成人av| 韩国三级电影久久久久久| 青青草原一区二区| 成人网在线免费观看| 亚洲精品网址在线观看| 欧美电影院免费观看| 日韩禁在线播放| 日韩av在线看| 日韩在线免费视频| 国产精品高潮呻吟久久av野狼| 国产精品久久久av| 成人午夜一级二级三级| 欧美视频在线免费| 欧美激情综合亚洲一二区| 国产精品女人久久久久久| 亚洲精品91美女久久久久久久| 国产久一一精品| 久久综合五月天| 亚洲精品久久久一区二区三区| 日韩欧美a级成人黄色| 欧美床上激情在线观看| 欧美激情xxxxx| 久热在线中文字幕色999舞| 国产乱人伦真实精品视频| 亚洲国产毛片完整版| 精品久久久久久中文字幕一区奶水| 亚洲国产成人久久综合一区| 91在线网站视频| 成人激情电影一区二区| 福利视频导航一区| 欧美视频中文字幕在线| 91网站在线免费观看| 日本高清不卡在线| 国产精品电影久久久久电影网| 在线播放国产精品| 日本精品免费观看| 国产一区在线播放| 91免费在线视频网站| 久久人人爽人人爽人人片av高清| 亚洲国产91色在线| 亚洲国产精品久久久| 亚洲黄色www网站| 色妞欧美日韩在线| 亚洲一区二区久久久| 亚洲大胆美女视频| 久久亚洲精品小早川怜子66| 成人激情视频在线| 午夜精品一区二区三区在线视| 亚洲电影中文字幕| 国产亚洲美女精品久久久| 国产91在线高潮白浆在线观看| 午夜精品蜜臀一区二区三区免费| 亚洲精品影视在线观看| 欧美国产日韩一区二区在线观看| 亚洲午夜精品视频| 久久乐国产精品| 久久频这里精品99香蕉| 秋霞av国产精品一区| 国产激情视频一区| 国产精品视频久久| 久久免费精品日本久久中文字幕| 国产欧美精品一区二区| 亚洲品质视频自拍网| 久久精品欧美视频| 国产精品99久久久久久久久| 97精品国产97久久久久久春色| 亚洲精品欧美一区二区三区| 国产视频欧美视频| 亚洲精品视频在线播放| 琪琪第一精品导航| 奇米一区二区三区四区久久| 亚洲精品福利资源站| 久久久噜久噜久久综合| 中文字幕亚洲一区二区三区| 日韩av日韩在线观看| 国产一区二区丝袜高跟鞋图片| 日韩av在线免费看| 国产精品视频永久免费播放| 神马国产精品影院av| 最近2019年日本中文免费字幕| 亚洲成人亚洲激情| 一本色道久久综合狠狠躁篇的优点| 国产精品丝袜久久久久久高清| 久久精品夜夜夜夜夜久久| 国产精品十八以下禁看| 精品一区精品二区| 色777狠狠综合秋免鲁丝| 亚洲精品成人网| 国产精品96久久久久久又黄又硬| 98精品在线视频| 国产啪精品视频网站| 欧美激情精品久久久久久免费印度| 国产在线精品一区免费香蕉| 麻豆成人在线看| 欧美视频一区二区三区…| 97免费视频在线| 欧美日韩国产精品一区二区三区四区| 亚洲欧美中文日韩v在线观看| 国产在线播放不卡| 亚洲自拍偷拍色图| 亚洲毛茸茸少妇高潮呻吟| 久久精品国产v日韩v亚洲| 色综合久久中文字幕综合网小说| 国产成人一区二区| 欧美裸体xxxx极品少妇| 欧美日韩在线一区| 亚洲摸下面视频| 日韩精品在线观看视频| 亚洲三级 欧美三级| 欧美巨乳美女视频| 色樱桃影院亚洲精品影院| 欧美日韩成人在线观看| 久久99久久久久久久噜噜| 亚洲www在线| 成人xvideos免费视频| 亚洲视频一区二区三区| 欧美精品videos性欧美| 国产精品6699| 成人免费看吃奶视频网站| 亚洲激情在线观看| 久久久精品一区| 中文字幕亚洲无线码在线一区| 久久久久国产一区二区三区| 欧美高清在线视频观看不卡| 亚洲激情视频在线播放| 亚洲最新视频在线| 欧美在线性视频| 亚洲男人天堂视频| 国产精品88a∨| 欧美一级电影免费在线观看| 97成人超碰免| 91最新在线免费观看| 欧美黄色片视频| 久久久久久有精品国产| 成人久久一区二区| 日韩成人激情在线| 亚洲另类xxxx| 91在线观看免费| 国产偷国产偷亚洲清高网站| 国产精品视频精品视频| 欧美专区国产专区| 亚洲激情国产精品| 国产精品91久久久|