最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

jquery lazyload延遲加載技術(shù)的實現(xiàn)原理分析

 更新時間:2011年01月24日 20:07:52   作者:  
懶加載技術(shù)(簡稱lazyload)并不是新技術(shù),它是js程序員對網(wǎng)頁性能優(yōu)化的一種方案。lazyload的核心是按需加載。在大型網(wǎng)站中都有l(wèi)azyload的身影,例如谷歌的圖片搜索頁,迅雷首頁,淘寶網(wǎng),QQ空間等。

前言

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

lazyload在什么場合中應(yīng)用比較合適?

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

如何實現(xiàn)lazyload?

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

  • 可視區(qū)域相對于瀏覽器頂端位置;
  • 待加載資源相對于瀏覽器頂端位置。

在得到以上兩點數(shù)據(jù)后,通過如下函數(shù),便可得出某對象是否在瀏覽器可視區(qū)域了。
返回瀏覽器的可視區(qū)域位置

復(fù)制代碼 代碼如下:

// 返回瀏覽器的可視區(qū)域位置
function getClient(){
var l, t, w, h;
l = document.documentElement.scrollLeft || document.body.scrollLeft;
t = document.documentElement.scrollTop || document.body.scrollTop;
w = document.documentElement.clientWidth;
h = document.documentElement.clientHeight;
return { left: l, top: t, width: w, height: h };
}

返回待加載資源位置
復(fù)制代碼 代碼如下:

// 返回待加載資源位置
function getSubClient(p){
var l = 0, t = 0, w, h;
w = p.offsetWidth;
h = p.offsetHeight;
while(p.offsetParent){
l += p.offsetLeft;
t += p.offsetTop;
p = p.offsetParent;
}
return { left: l, top: t, width: w, height: h };
}

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

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

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

<div style="width:100px; height:3000px"></div>
<div id="div1" style="width:50px; height:50px; background:red; position:absolute; top:1000px">
</div>

復(fù)制代碼 代碼如下:

var div1 = document.getElementById("div1");
window.onscroll = function(){
var prec1 = getClient();
var prec2 = getSubClient(div1);
if (intens(prec1, prec2)) {
alert("true");
}
};

我們只需要在彈出窗口的地方加載我們需要的資源。
這里值得注意的是 : 目標(biāo)對象呈現(xiàn)在客戶區(qū)域時,會隨著滾動而不斷的彈出窗口。因此我們需要在彈出第一個窗口后取消對該區(qū)域的監(jiān)測,這里用一個數(shù)組來收集需要監(jiān)測的對象,同時將監(jiān)測的邏輯抽出來。同時需要注意 onscroll事件和onresize事件都會改變游覽器可視區(qū)域信息,因此在該類事件觸發(fā)后需要重新計算,這里用autocheck()函數(shù)實現(xiàn)。
增加元素 :
復(fù)制代碼 代碼如下:

<div id="div2" style="width:50px; height:50px; background:blue; position:absolute; top:2500px">

復(fù)制代碼 代碼如下:

// 比較某個子區(qū)域是否呈現(xiàn)在瀏覽器區(qū)域
function jiance(arr, prec1, callback){
var prec2;
for (var i = arr.length - 1; i >= 0; i--) {
if (arr[i]) {
prec2 = getSubClient(arr[i]);
if (intens(prec1, prec2)) {
callback(arr[i]);
// 加載資源后,刪除監(jiān)測
delete arr[i];
}
}
}
}

復(fù)制代碼 代碼如下:

// 檢測目標(biāo)對象是否出現(xiàn)在客戶區(qū)
function autocheck(){
var prec1 = getClient();
jiance(arr, prec1, function(obj){
// 加載資源...
alert(obj.innerHTML);
})
}
// 子區(qū)域一
var d1 = document.getElementById("d1");
// 子區(qū)域二
var d2 = document.getElementById("d2");
// 需要按需加載區(qū)域集合
var arr = [d1, d2];
window.onscroll = function(){
// 重新計算
  autocheck();
}
window.onresize = function(){
// 重新計算
autocheck();
}

相關(guān)文章

最新評論

江西省| 德格县| 察雅县| 庐江县| 竹山县| 胶南市| 临高县| 临沧市| 独山县| 汉源县| 筠连县| 乐至县| 枞阳县| 恭城| 水城县| 康定县| 抚顺县| 河北区| 易门县| 阿拉善盟| 犍为县| 上杭县| 丰宁| 武功县| 灵宝市| 元氏县| 拉萨市| 平泉县| 龙口市| 山丹县| 梁山县| 丹寨县| 汉阴县| 廊坊市| 江山市| 黄石市| 柳江县| 江安县| 重庆市| 班戈县| 垫江县|