亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2014年06月05日 11:36:44   作者:  
這篇文章主要介紹了用js的document.write輸出的廣告無阻塞加載的方法,需要的朋友可以參考下

一、廣告代碼分析

很多第三方的廣告系統(tǒng)都是使用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>" );

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

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



二、重寫document.write

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



三、延遲加載javascript代碼

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

將script標簽放到textarea標簽中,等需要加載的時候再讀取textarea的內容,這樣可以實現(xiàn)真正的延遲加載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,下面是代碼實現(xiàn):

復制代碼 代碼如下:

/**
 * 重寫document.write實現(xiàn)無阻塞加載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, 
  // 創(chuàng)建一個新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 );
};

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

實現(xiàn)了無阻塞式的延遲加載javascript廣告代碼,能否進一步優(yōu)化?如果廣告沒在首屏出現(xiàn),能否像通常的圖片的延遲加載一樣來進行延遲加載?答案是肯定的。對我之前寫的圖片延遲加載的小插件進行擴展,將原來的圖片加載方式(替換src)改成上面的loadScript方式加載就可以實現(xiàn)。當然,僅僅是這樣的修改還是會有問題的。如果有多個圖片,并且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();
 }
};


圖片延遲加載器請參閱比文:http://chabaoo.cn/article/50685.htm 

相關文章

  • JS常用跨域方法實現(xiàn)原理解析

    JS常用跨域方法實現(xiàn)原理解析

    這篇文章主要介紹了JS常用跨域方法實現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-12-12
  • 一篇文章搞定JavaScript類型轉換(面試常見)

    一篇文章搞定JavaScript類型轉換(面試常見)

    這篇文章主要介紹了一篇文章搞定JavaScript類型轉換(面試常見),非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-01-01
  • div失去焦點事件實現(xiàn)思路

    div失去焦點事件實現(xiàn)思路

    blur只是針對form表單控件的,而對于 span , div , li 之類的,則沒辦法觸發(fā)它們的動作,本文有個示例,看看是怎么實現(xiàn)的
    2014-04-04
  • javascript 常見功能匯總

    javascript 常見功能匯總

    本文給大家匯總介紹了集中常見的功能,十分的實用,有需要的小伙伴可以參考下。
    2015-06-06
  • JS設置時間無效問題的解決辦法

    JS設置時間無效問題的解決辦法

    在發(fā)送短信息驗證碼的時候要用到js設置時間倒序問題,有時候會導致js失效問題,怎么辦呢?今天小編給大家分享JS設置時間無效問題的解決辦法,需要的朋友參考下吧
    2017-02-02
  • Javascript 鼠標移動上去小三角形滑塊緩慢跟隨效果

    Javascript 鼠標移動上去小三角形滑塊緩慢跟隨效果

    一個tab選項卡,當鼠標移動上去時紅色滑塊跟隨,在布局過程中經(jīng)常會使用到,本文提供了詳細的實現(xiàn)代碼,感興趣的朋友可以參考下
    2013-04-04
  • js將類數(shù)組對象轉換成數(shù)組對象

    js將類數(shù)組對象轉換成數(shù)組對象

    javascript與dom有許多瑕疵,如著名的類數(shù)組對象Arguments,其他諸如HTMLCollection,NodeList如果它們都是數(shù)組的子類,那多省時啊。
    2010-05-05
  • JavaScript代碼編寫中各種各樣的坑和填坑方法

    JavaScript代碼編寫中各種各樣的坑和填坑方法

    這篇文章主要介紹了JavaScript代碼編寫中各種各樣的坑和填坑方法,相信你肯定遇到過這些陷阱,而且陷入過,本文共計介紹了5種坑和填坑方法,需要的朋友可以參考下
    2014-06-06
  • JavaScript實現(xiàn)的浮動層框架用法實例分析

    JavaScript實現(xiàn)的浮動層框架用法實例分析

    這篇文章主要介紹了JavaScript實現(xiàn)的浮動層框架用法,以實例形式分析了JavaScript實現(xiàn)可關閉的半透明浮動層相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • 關于RxJS Subject的學習筆記

    關于RxJS Subject的學習筆記

    這篇文章主要介紹了關于RxJS Subject的學習筆記,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12

最新評論