`

jquery lazyload延迟加载技术的实现原理分析

阅读更多

转:http://www.jb51.net/article/26125.htm

前言

 

懒加载技术(简称lazyload)并不是新技术,它是js程序员对网页性能优化的一种方案。lazyload的核心是按需加载。在大型网站中都有 lazyload的身影,例如谷歌的图片搜索页,迅雷首页,淘宝网,QQ空间等。因此掌握lazyload技术是个不错的选择,可惜jquery插件 lazy load官网(http://www.appelsiini.net/projects/lazyload)称不支持新版浏览器。

 

lazyload在什么场合中应用比较合适?

 

涉及到图片,falsh资源,iframe,网页编辑器(类似FCK)等占用较大带宽,且这些模块暂且不在浏览器可视区内,因此可以使用lazyload在适当的时候加载该类资源。避免网页打开时加载过多资源,让用户等待太久。

 

如何实现lazyload?

 

lazyload的难点在如何在适当的时候加载用户需要的资源(这里用户需要的资源指该资源呈现在浏览器可视区域)。因此我们需要知道几点信息来确定目标是否已呈现在客户区,其中包括:

 

  • 可视区域相对于浏览器顶端位置;
  • 待加载资源相对于浏览器顶端位置。

 

在得到以上两点数据后,通过如下函数,便可得出某对象是否在浏览器可视区域了。
返回浏览器的可视区域位置

复制代码 代码如下:

// 返回浏览器的可视区域位置
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 };
}


返回待加载资源位置

复制代码 代码如下:

// 返回待加载资源位置
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 };
}


其中 函数getClient()返回浏览器客户区区域信息,getSubClient()返回目标模块区域信息。此时确定目标模块是否出现在客户区实际上是确定如上两个矩形是否相交。

复制代码 代码如下:

// 判断两个矩形是否相交,返回一个布尔值
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 ;
}


现在基本上可以实现延时加载了,接下来,我们在window.onscroll事件中编写一些代码监控目标区域是否呈现在客户区。

复制代码 代码如下:

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

 

复制代码 代码如下:

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


我们只需要在弹出窗口的地方加载我们需要的资源。
这 里值得注意的是 : 目标对象呈现在客户区域时,会随着滚动而不断的弹出窗口。因此我们需要在弹出第一个窗口后取消对该区域的监测,这里用一个数组来收集需要监测的对象,同时 将监测的逻辑抽出来。同时需要注意 onscroll事件和onresize事件都会改变游览器可视区域信息,因此在该类事件触发后需要重新计算,这里用autocheck()函数实现。
增加元素 :

复制代码 代码如下:

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

 

复制代码 代码如下:

// 比较某个子区域是否呈现在浏览器区域
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]);
// 加载资源后,删除监测
delete arr[i];
}
}
}
}

 

复制代码 代码如下:


// 检测目标对象是否出现在客户区
function autocheck(){
var prec1 = getClient();
jiance(arr, prec1, function(obj){
// 加载资源...
alert(obj.innerHTML);
})
}
// 子区域一
var d1 = document.getElementById("d1");
// 子区域二
var d2 = document.getElementById("d2");
// 需要按需加载区域集合
var arr = [d1, d2];
window.onscroll = function(){
// 重新计算
  autocheck();
}
window.onresize = function(){
// 重新计算
autocheck();
}

分享到:
评论

相关推荐

    jquery.lazyload图片预加载效果 jquery预加载

    《jQuery LazyLoad 图片预加载技术详解》 在网页设计中,图片的加载速度往往直接影响着用户体验。当页面中包含大量图片时,如果一次性全部加载,可能会导致页面加载时间过长,用户需要等待,这无疑降低了网站的可用...

    动态加载的图片LazyLoad

    动态加载,也称为延迟加载或懒加载,是一种优化网页性能的...通过查看和分析这个示例,你可以更深入地理解JQuery.LazyLoad的工作原理以及如何解决可能出现的问题。记得在本地环境中运行这个示例,以便于调试和测试。

    Lazyload 延迟加载效果 -源码.zip

    总结来说,"Lazyload 延迟加载效果"是一种提高网页性能的策略,通过压缩包中的源码学习,可以深入理解其实现原理,并掌握如何在自己的项目中应用这一技术,提高用户体验。通过解压并分析"内容来自存起来软件站...

    延迟加载图片jquery.lazyload.js

    ### 延迟加载图片技术详解:利用jquery.lazyload.js实现高效页面加载 #### 技术背景 在互联网时代,网站或应用中的图片资源占据了大量的数据传输量,尤其是在移动网络环境下,图片的加载速度直接影响了用户体验及...

    jquery图片延迟加载

    通过jQuery Lazyload,开发者可以轻松地为网站增加图片延迟加载功能,从而提高页面性能,减少用户等待时间,提升浏览体验。结合源码分析和实践应用,我们可以更深入理解这一工具的内部工作机制,为网站优化提供更多...

    网页延迟加载修正js

    1. **jQuery 插件开发**:jQuery.LazyLoad.js 是基于 jQuery 框架构建的插件,它利用 jQuery 的事件监听和DOM操作功能来实现延迟加载。开发者需要熟悉 jQuery 的 API,如 `.on()`, `.attr()`, `.data()` 等,以理解...

    jQuery延迟加载图片插件Lazy Load使用指南

    3. **初始化插件**:在jQuery的DOM准备就绪事件中,调用`.lazyload()`方法,指定延迟加载的图片类名: ```javascript $(“img.lazy”).lazyload(); ``` **二、配置选项与优雅降级** 1. **敏感度设置**:默认...

    jQuery图片懒加载代码

    综上所述,jQuery图片懒加载技术通过延迟加载非可视区域的图片,有效提高了网页加载速度,降低了用户等待时间,提升了整体的用户体验。通过理解并应用这些知识点,你可以为自己的项目构建出高效且用户友好的图片加载...

    testing_vanilla-lazyload

    Vanilla LazyLoad就是这样一个专注于图片和IFrame懒加载的轻量级库,它无需依赖任何外部库,如jQuery,仅使用原生JavaScript实现。 Vanilla LazyLoad的工作原理主要基于以下几点: 1. 数据属性标识:通过在图片或...

    Echojs延迟加载图片JavaScript微型库

    为了优化网站性能,延迟加载(Lazy Loading)技术应运而生。"Echojs延迟加载图片JavaScript微型库"就是一种实现这一功能的优秀解决方案。 **延迟加载的原理与重要性** 延迟加载,顾名思义,是指在用户滚动页面到...

    jquery图片展示特效

    jQuery配合插件如"jquery.lazyload.js"可轻松实现此功能。 6. HTML与CSS辅助:在"index.html"中,HTML结构和CSS样式是图片展示的基础。合理的布局和恰当的CSS可以优化图片展示的视觉效果,如设置图片边框、阴影,...

    图片懒加载

    为了提高页面加载速度和节省用户流量,"图片懒加载"(Lazy Load)技术应运而生。这种技术旨在延迟非可视区域内的图片加载,直到用户滚动到它们时才进行加载,从而优化网页性能。 ### 一、图片懒加载的原理 图片懒...

    JS图片懒加载技术实现过程解析

    懒加载技术(LazyLoad)是一种常见的前端优化策略,旨在提高网页加载速度和用户体验。在网页中,图片往往是占用流量最多的内容之一,特别是高清大图,它们的加载时间可能会显著影响页面的整体加载速度。懒加载的核心...

Global site tag (gtag.js) - Google Analytics