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

首頁 > 編程 > JavaScript > 正文

用js的document.write輸出的廣告無阻塞加載的方法

2019-11-20 14:52:09
字體:
來源:轉載
供稿:網友

一、廣告代碼分析

很多第三方的廣告系統都是使用document.write來加載廣告,如下面的一個javascript的廣告鏈接。

復制代碼 代碼如下:

<script type="text/javascript" src="http://gg.5173.com/adpolestar/5173/
;ap=2EBE5681_1BA3_4663_FA3F_E73D2B83FBDC;ct=js;pu=5173;/?"></script>

這個javascript請求返回的是這樣的一段代碼:

復制代碼 代碼如下:

document.write( "<a +
"ad=6FF3F844_33E6_86EE_3B96_D94C1CF1AEC4;ap=2EBE5681_1BA3_4663_FA3F_E73D2B83FBDC;" +
"pu=5173;/?http://www.7bao.com/g/xlsbz/index' target='_blank'><img src='" +
"http://html.5173cdn.com/market/yunyinga/xly132.gif' " +
"border='0' width="132px" height="58px" /></a>" );

這種看似有點二的加載方式,但是你卻沒辦法改造它,因為它本身就是第三方的。并且代碼都添加了統計的功能,上面的javascript的廣告鏈接每請求一次都會統計一次,生成的代碼也有點擊統計的功能,也就是說必須以這種方式來進行加載。

document.write是在頁面渲染的時候同步進行的,必須要等javascript代碼下載好并且document.write執行完后才接著渲染后面的內容,如果廣告比較多的話,就會導致頁面阻塞,尤其是在頁面的首屏插好幾個圖片尺寸比較大的這種廣告,那么阻塞情況就相當明顯和嚴重,會讓用戶覺得你這個網頁很慢。



二、重寫document.write

為了避免阻塞,就不能讓document.write方法在頁面渲染的時候執行,必須想辦法讓javascript的廣告代碼在DOM樹就緒(DOM ready)之后才執行,但是在DOM樹就緒后執行document.write會重新渲染整個頁面,這樣也是不行的。document.write雖然是瀏覽器原生的方法,但是也可以自定義一個方法來覆蓋掉原來的方法。在javascript廣告代碼加載之前,重寫document.write,等加載并執行完再改回來。



三、延遲加載javascript代碼

上面比較關鍵的一步,延遲加載javascript代碼,如何實現呢?先嘗試通過改寫script的type屬性,比如將type設置成一個自定義的屬性”type/cache”,但這樣大部分瀏覽器(Chrome不會下載)仍然會下載這段代碼,但不會執行,在頁面渲染的時候下載這么一段代碼仍然會阻塞,通過改寫script的type并不能實現真正的延遲加載,最多能實現只加載不執行,而且還存在兼容問題。

將script標簽放到textarea標簽中,等需要加載的時候再讀取textarea的內容,這樣可以實現真正的延遲加載script,這個方法要感謝玉伯提出的BigRender(墻外)方案。

復制代碼 代碼如下:

<div>
<textarea style="display:none">
<script type="text/javascript" src="http://gg.5173.com/adpolestar/5173/
;ap=2EBE5681_1BA3_4663_FA3F_E73D2B83FBDC;ct=js;pu=5173;/?"></script>
</textarea>
</div>

延遲加載script并重寫document.write,下面是代碼實現:

復制代碼 代碼如下:

/**
 * 重寫document.write實現無阻塞加載script
 * @param { Dom Object } textarea元素
 */
var loadScript = function( elem ){
 var url = elem.value.match( /src="([/s/S]*?)"/i )[1],
  parent = elem.parentNode,
  // 緩存原生的document.write
  docWrite = document.write, 
  // 創建一個新script來加載
  script = document.createElement( 'script' ),
  head = document.head ||
   document.getElementsByTagName( 'head' )[0] ||
   document.documentElement;

 // 重寫document.write
 document.write = function( text ){
  parent.innerHTML = text;
 };

 script.type = 'text/javascript';
 script.src = url;

 script.onerror =
 script.onload =
 script.onreadystatechange = function( e ){
  e = e || window.event;
  if( !script.readyState ||
  /loaded|complete/.test(script.readyState) ||
  e === 'error'
  ){

   // 恢復原生的document.write
   document.write = docWrite;
   head.removeChild( script );

   // 卸載事件和斷開DOM的引用
   // 盡量避免內存泄漏
   head =    
   parent =
   elem =
   script =
   script.onerror =
   script.onload =
   script.onreadystatechange = null;

  }
 }

 // 加載script
 head.insertBefore( script, head.firstChild );
};

四、圖片延遲加載的增強版

實現了無阻塞式的延遲加載javascript廣告代碼,能否進一步優化?如果廣告沒在首屏出現,能否像通常的圖片的延遲加載一樣來進行延遲加載?答案是肯定的。對我之前寫的圖片延遲加載的小插件進行擴展,將原來的圖片加載方式(替換src)改成上面的loadScript方式加載就可以實現。當然,僅僅是這樣的修改還是會有問題的。如果有多個圖片,并且loadScript是同時進行的,而document.write又是全局的方法,保不準在加載A的時候不影響到B,必須讓它們一個個的按順序加載,加載完A之后才能加載B。

五、隊列控制

為了讓javascript廣告代碼按順序加載就需要一個隊列來控制加載。于是又有了下面這段簡單的隊列控制代碼:

復制代碼 代碼如下:

var loadQueue = [];
// 入列
var queue = function( data ){
 loadQueue.push( data );
 if( loadQueue[0] !== 'runing' ){
  dequeue();
 }
};
// 出列 
var dequeue = function(){
 var fn = loadQueue.shift();
 if( fn === 'runing' ){
  fn = loadQueue.shift();
 }

 if( fn ){
  loadQueue.unshift( 'runing' );
  fn();
 }
};


圖片延遲加載器請參閱比文://www.49028c.com/article/50685.htm 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
午夜精品福利视频| 欧美理论电影在线观看| 亚洲精品国产电影| 国产欧美日韩综合精品| 另类专区欧美制服同性| 精品久久久久久中文字幕| 亚洲欧美日本精品| 国产精品久久国产精品99gif| 国产最新精品视频| 国产精品99蜜臀久久不卡二区| 国产精品久久久久久久久男| 亚洲一区二区三| 国产成人亚洲综合91精品| 2020久久国产精品| 欧美综合一区第一页| 国产91成人在在线播放| 久久天天躁狠狠躁老女人| 欧美激情精品久久久久久蜜臀| 欧美超级免费视 在线| 国模吧一区二区三区| 少妇高潮久久77777| 亚洲国产毛片完整版| 欧美大尺度电影在线观看| 日韩成人小视频| 国内精品视频久久| 国产精品爽爽爽爽爽爽在线观看| 欧美风情在线观看| 欧美中文在线观看国产| 国产精品羞羞答答| 国内精品在线一区| 青青在线视频一区二区三区| 久久免费成人精品视频| 亚洲精美色品网站| 亚洲最新av在线| 国产精品看片资源| 中文字幕不卡在线视频极品| 亚洲免费高清视频| 久久97精品久久久久久久不卡| 色综合色综合久久综合频道88| 伊人伊成久久人综合网站| 欧美三级免费观看| 成人h视频在线| 精品成人在线视频| 欧美激情网站在线观看| 97国产在线视频| 亚洲精品久久久久| 91探花福利精品国产自产在线| 国产精品电影一区| 久久久久久亚洲精品中文字幕| 亚洲一区二区三区xxx视频| 中日韩美女免费视频网站在线观看| 国产日韩在线亚洲字幕中文| 大荫蒂欧美视频另类xxxx| 久久精品国产2020观看福利| 国产精品美女在线| 欧美日韩亚洲一区二| 欧美激情视频三区| 欧美高清一级大片| 亚洲国产精品热久久| 精品一区二区三区三区| 91久久精品国产91性色| 日韩毛片在线看| 久久久亚洲成人| 日韩成人在线视频观看| 欧美激情亚洲视频| 国产精品爽爽ⅴa在线观看| 中文字幕在线看视频国产欧美在线看完整| 精品久久中文字幕久久av| 国产精品久久国产精品99gif| 久久久久久欧美| 色播久久人人爽人人爽人人片视av| 国产精品久久久91| 日韩国产在线看| 国产精品福利在线观看网址| 九九热精品视频国产| 国产精品嫩草影院一区二区| 日韩精品免费在线视频| 日本精品视频在线观看| 欧美视频国产精品| 狠狠操狠狠色综合网| 中文字幕亚洲综合久久筱田步美| 亚洲精品国偷自产在线99热| 欧美精品激情视频| 91国产美女在线观看| 欧美激情视频一区二区三区不卡| 国产精品老牛影院在线观看| 久精品免费视频| 国产精品免费久久久久影院| 亚洲自拍偷拍第一页| 国产精品av免费在线观看| 91高清视频免费| 久久国产精品99国产精| 国产成人精品国内自产拍免费看| 午夜精品国产精品大乳美女| 性色av一区二区咪爱| 欧美亚洲第一页| 国产精品久久久久久久久久尿| 韩国精品美女www爽爽爽视频| 亚洲另类激情图| 69久久夜色精品国产69| 亚洲国产精品电影| 色偷偷888欧美精品久久久| 欧美成人免费全部观看天天性色| 欧美一区二区三区精品电影| 国产成人在线一区| 海角国产乱辈乱精品视频| 国产偷亚洲偷欧美偷精品| 91av视频在线免费观看| 一区二区福利视频| 亚洲乱亚洲乱妇无码| 91精品国产成人www| 97视频免费看| 精品国产成人在线| 亚洲精品中文字幕女同| 国产日韩综合一区二区性色av| 欧美成人午夜视频| 亚洲精品网站在线播放gif| 91精品美女在线| 中文字幕av日韩| 欧美国产视频日韩| 国产精品va在线播放| 欧美性xxxxhd| 国产精品96久久久久久| 少妇高潮久久77777| 精品一区电影国产| 亚洲美女av在线| 91香蕉亚洲精品| 亚洲精品国产精品国产自| 国产精品高潮呻吟久久av野狼| 欧美日韩国产精品一区二区三区四区| 欧美精品日韩www.p站| 久久精品国产亚洲一区二区| 中文字幕av日韩| 欧美亚洲国产精品| 国内精品久久久久久久久| 一区二区三区 在线观看视| 亚洲欧美www| 欧美日韩精品中文字幕| 国产一区香蕉久久| 三级精品视频久久久久| 中文字幕国产精品| 亚洲国产成人91精品| 亚洲一区二区中文| 欧美成人自拍视频| 日韩精品免费在线观看| 成人福利网站在线观看11| 日韩激情视频在线| 国产日韩欧美视频| 欧美激情中文字幕在线| 国产精品海角社区在线观看| 中文字幕日韩高清| 国外日韩电影在线观看| 精品在线欧美视频| 国产成人免费av电影| 一区二区三区国产视频| 国产亚洲视频在线观看| 日韩美女毛茸茸| 色哟哟亚洲精品一区二区| 在线观看日韩欧美| 日本aⅴ大伊香蕉精品视频| 国产日韩中文字幕在线| 国产日韩在线亚洲字幕中文| 欧美中文在线视频| 久久亚洲影音av资源网|