日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
JavaScript懶加載技術(shù)(lazyload)簡單實(shí)現(xiàn)

懶加載技術(shù)(簡稱lazyload)并不是新技術(shù), 它是javascript程序員對網(wǎng)頁性能優(yōu)化的一種方案.lazyload的核心是按需加載.在大型網(wǎng)站中都有l(wèi)azyload的身影,例如谷歌的圖片搜索頁,迅雷首頁,淘寶網(wǎng),QQ空間等.因此掌握lazyload技術(shù)是個(gè)不錯(cuò)的選擇,可惜jquery插件lazy load官網(wǎng)(http://www.appelsiini.net/projects/lazyload)稱不支持新版瀏覽器。

1.lazyload在什么場合中應(yīng)用比較合適?
  涉及到圖片,falsh資源 , iframe, 網(wǎng)頁編輯器(類似FCK)等占用較大帶寬,且這些模塊暫且不在瀏覽器可視區(qū)內(nèi),因此可以使用lazyload在適當(dāng)?shù)臅r(shí)候加載該類資源.避免網(wǎng)頁打開時(shí)加載過多資源,讓用戶等待太久.

2.如何實(shí)現(xiàn)lazyload?
  lazyload的難點(diǎn)在如何在適當(dāng)?shù)臅r(shí)候加載用戶需要的資源(這里用戶需要的資源指該資源呈現(xiàn)在瀏覽器可視區(qū)域)。因此我們需要知道幾點(diǎn)信息來確定目標(biāo)是否已呈現(xiàn)在客戶區(qū),其中包括:
    1.可視區(qū)域相對于瀏覽器頂端位置
    2.待加載資源相對于瀏覽器頂端位置.

在得到以上兩點(diǎn)數(shù)據(jù)后,通過如下函數(shù),便可得出某對象是否在瀏覽器可視區(qū)域了.

 
 
 
  1. //返回瀏覽器的可視區(qū)域位置  
  2.    function getClient(){  
  3.      var l,t,w,h;  
  4.      l = document.documentElement.scrollLeft || document.body.scrollLeft;  
  5.      t = document.documentElement.scrollTop || document.body.scrollTop;  
  6.      w = document.documentElement.clientWidth;  
  7.      h = document.documentElement.clientHeight;  
  8.      return {'left':l,'top':t,'width':w,'height':h} ;  
  9.    }  
  10.  
  11.   //返回待加載資源位置  
  12.    function getSubClient(p){  
  13.      var l = 0,t = 0,w,h;  
  14.      w = p.offsetWidth ;  
  15.      h = p.offsetHeight;  
  16.  
  17.     while(p.offsetParent){  
  18.     l += p.offsetLeft ;  
  19.      t += p.offsetTop ;  
  20.      p = p.offsetParent;  
  21.   }  
  22.  
  23.   return {'left':l,'top':t,'width':w,'height':h } ;  

其中 函數(shù) getClient()返回瀏覽器客戶區(qū)區(qū)域信息,getSubClient()返回目標(biāo)模塊區(qū)域信息。此時(shí)確定目標(biāo)模塊是否出現(xiàn)在客戶區(qū)實(shí)際上是確定如上兩個(gè)矩形是否相交.

 
 
 
  1. //判斷兩個(gè)矩形是否相交,返回一個(gè)布爾值  
  2.     function intens(rec1,rec2){  
  3.        var lc1,lc2,tc1,tc2,w1,h1;  
  4.        lc1 = rec1.left + rec1.width / 2;  
  5.        lc2 = rec2.left + rec2.width / 2;  
  6.        tc1 = rec1.top + rec1.height / 2 ;  
  7.        tc2 = rec2.top + rec2.height / 2 ;  
  8.        w1 = (rec1.width + rec2.width) / 2 ;  
  9.        h1 = (rec1.height + rec2.height) / 2;  
  10.        return Math.abs(lc1 - lc2) < w1 && Math.abs(tc1 - tc2) < h1 ;  
  11.     }  

現(xiàn)在基本上可以實(shí)現(xiàn)延時(shí)加載了,接下來,我們在 window.onscroll 事件中編寫一些代碼監(jiān)控目標(biāo)區(qū)域是否呈現(xiàn)在客戶區(qū).

 
 
 
  1. "width:100px; height:3000px">  
  2.     "d1" style = "width:50px; height:50px; background:red;position:absolute; top:1000px">  
  3.      
  4.     var d1 = document.getElementById("d1");  
  5.     window.onscroll = function(){  
  6.        var prec1 = getClient();   
  7.        var prec2 =  getSubClient(d1);  
  8.         if(intens(prec1,prec2)){  
  9.           alert("true")  
  10.         }  
  11.     } 

我們只需要在彈出窗口的地方加載我們需要的資源.
這里值得注意的是:目標(biāo)對象呈現(xiàn)在客戶區(qū)域時(shí),會隨著滾動而不斷的彈出窗口.因此我們需要在彈出第一個(gè)窗口后取消對該區(qū)域的監(jiān)測,這里用一個(gè)數(shù)組來收集需要監(jiān)測的對象。還需要注意:因?yàn)閛nscroll事件和onresize事件都會改變游覽器可視區(qū)域信息,因此在該類事件觸發(fā)后需要重新計(jì)算目標(biāo)對象是否在可視區(qū)域,這里用autocheck()函數(shù)實(shí)現(xiàn).(迅雷首頁的lazyload沒有在onresize事件中重新計(jì)算目標(biāo)對象是否在瀏覽器可視區(qū)域,因此如果先將瀏覽器窗口縮小到一定尺寸后滾動到需要加載圖片的區(qū)域后點(diǎn)擊最大化,圖片加載不出來,呵呵,以后需要注意了).

增加元素:

 
 
 
  1. "d2" style = "width:50px; height:50px;
  2.  background:blue;position:absolute; 
  3. top:2500px">  
 
 
 
  1.  //比較某個(gè)子區(qū)域是否呈現(xiàn)在瀏覽器區(qū)域  
  2.     function jiance(arr,prec1,callback){  
  3.       var prec2;  
  4.       for(var i = arr.length - 1 ; i >= 0 ;i--){  
  5.         if(arr[i]){  
  6.          prec2 =  getSubClient(arr[i]);  
  7.          if(intens(prec1,prec2)){  
  8.             callback(arr[i]);  
  9.             //加載資源后,刪除監(jiān)測  
  10.             delete arr[i];  
  11.            }  
  12.         }  
  13.       }  
  14.     }  
  15.     
  16.     //檢測目標(biāo)對象是否出現(xiàn)在客戶區(qū)  
  17.     function autocheck(){  
  18.        var prec1 = getClient();   
  19.        jiance(arr,prec1,function(obj){  
  20.  
  21.       //加載資源...  
  22.         alert(obj.innerHTML)  
  23.        })  
  24.     }  
  25.     //子區(qū)域一     
  26.     var d1 = document.getElementById("d1");  
  27.     //子區(qū)域二  
  28.     var d2 = document.getElementById("d2");  
  29.  
  30.    //需要按需加載區(qū)域集合  
  31.     var arr = [d1,d2];  
  32.     window.onscroll = function(){  
  33.  
  34.      //重新計(jì)算  
  35.        autocheck();  
  36.     }  
  37.  
  38.     window.onresize = function(){  
  39.  
  40.      //重新計(jì)算  
  41.        autocheck();  
  42.     }  
  43.   

現(xiàn)在我們只需要在彈窗的地方加載我們需要的資源了.源碼就不貼出來了.如果需要的朋友,或著存在疑問的地方,可以聯(lián)系我.

原文鏈接:http://www.cnblogs.com/a_bu/archive/2011/01/16/1936989.html

【編輯推薦】

  1. 雙倍經(jīng)驗(yàn)助你升級 JavaScript編程最佳法則
  2. 提升JavaScript遞歸效率:Memoization技術(shù)詳解
  3. 揭秘JavaScript對Cookie的操作

新聞名稱:JavaScript懶加載技術(shù)(lazyload)簡單實(shí)現(xiàn)
網(wǎng)頁鏈接:http://m.5511xx.com/article/cccieho.html