成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JavaScript懶加載技術(lazyload)簡單實現

開發 前端
懶加載技術(簡稱lazyload)并不是新技術, 它是javascript程序員對網頁性能優化的一種方案.lazyload的核心是按需加載.在大型網站中都有lazyload的身影.jquery插件lazy load官網稱不支持新版瀏覽器。

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

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

2.如何實現lazyload?
  lazyload的難點在如何在適當的時候加載用戶需要的資源(這里用戶需要的資源指該資源呈現在瀏覽器可視區域)。因此我們需要知道幾點信息來確定目標是否已呈現在客戶區,其中包括:
    1.可視區域相對于瀏覽器頂端位置
    2.待加載資源相對于瀏覽器頂端位置.

在得到以上兩點數據后,通過如下函數,便可得出某對象是否在瀏覽器可視區域了.

  1. //返回瀏覽器的可視區域位置  
  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 } ;  

其中 函數 getClient()返回瀏覽器客戶區區域信息,getSubClient()返回目標模塊區域信息。此時確定目標模塊是否出現在客戶區實際上是確定如上兩個矩形是否相交.

  1. //判斷兩個矩形是否相交,返回一個布爾值  
  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.     }  

現在基本上可以實現延時加載了,接下來,我們在 window.onscroll 事件中編寫一些代碼監控目標區域是否呈現在客戶區.

  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.     } 

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


增加元素:

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

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

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

【編輯推薦】

  1. 雙倍經驗助你升級 JavaScript編程最佳法則
  2. 提升JavaScript遞歸效率:Memoization技術詳解
  3. 揭秘JavaScript對Cookie的操作
責任編輯:陳貽新 來源: 仰光的博客
相關推薦

2021-03-19 06:31:06

vue-lazyloa圖片懶加載項目

2020-11-18 09:30:29

圖片懶加載前端瀏覽器

2025-06-18 10:05:26

2011-03-17 10:37:07

JavaScript

2021-08-16 12:32:37

HashMap八股文面試

2011-07-22 13:30:52

JavaScript

2024-01-08 08:50:19

Vue3級聯菜單數據懶加載

2014-11-05 10:31:28

2015-10-08 10:58:51

圖片懶加載

2017-03-28 10:11:12

Webpack 2React加載

2021-02-21 11:40:25

技術優化實踐

2022-06-07 08:18:49

懶加載Web前端

2019-04-03 10:50:09

Javascript區塊鏈技術

2022-04-28 08:52:40

懶加載Web

2018-09-18 10:11:21

前端vue.jsjavascript

2023-06-06 15:31:13

JavaScript開發

2019-09-09 09:05:59

圖片框架懶加載

2018-08-02 14:08:47

小程序javascriptlazyload

2013-07-15 16:39:41

iOS多線程GCD實戰串行隊列實現預加載

2021-08-24 06:38:37

Node.js COW 文件復制
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 福利视频网址 | 精品一区二区观看 | 人人cao| 久久久久久美女 | 久操伊人| 久久天天躁狠狠躁夜夜躁2014 | 国产91在线 | 欧美 | 不卡一区二区三区四区 | 日韩精品一区二区三区久久 | 欧美日韩一 | 久久av网站 | 亚洲国产精品一区 | 久久国产成人午夜av影院武则天 | 毛片入口| 国产精品久久久久久久久免费高清 | 亚洲成人观看 | 久久这里只有精品首页 | 精品欧美一区二区精品久久久 | 欧美在线一区二区三区 | 日本网站免费在线观看 | 91免费视频观看 | 亚洲午夜视频在线观看 | 亚洲视频免费在线观看 | 日韩视频在线观看中文字幕 | 草久在线视频 | 日韩精品在线看 | 亚洲高清视频在线观看 | 日本五月婷婷 | 91精品久久久久久久久久小网站 | 日韩在线小视频 | 久久免费视频1 | 999久久久久久久 | 亚洲日本乱码在线观看 | 啪啪综合网 | 久久久久久久久久久久亚洲 | 在线免费国产 | 亚洲国产精品一区二区久久 | 美日韩精品 | 亚洲精品女优 | 国产午夜精品一区二区三区四区 | 欧美亚洲国产日韩 |