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

前言

懒加载技术(简称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();
}

时间: 2024-09-10 12:32:23

jquery lazyload延迟加载技术的实现原理分析_jquery的相关文章

jQuery实现图片走马灯效果的原理分析_jquery

本文实例分析了jQuery实现图片走马灯效果的原理.分享给大家供大家参考,具体如下: 这里只讲解水平走马灯效果,垂直向上走马灯效果不讲解,原理一样,但是水平走马灯效果有一个小坑.待会讲解 先上代码: HTML: <div class="box"> <div style="width: 1000px;" id="boxdiv"> <ul> <li style="display: block;&qu

jquery引用方法时传递参数原理分析_jquery

经常到网上去下载大牛们写的js插件.每次只需将js引用并设置下变量就行了,但一直没搞明白原理(主要是大牛们的代码太简练了-,-). 这次弄清了如何传递.设置多个(很多个)参数. 如 方法为function lunbo(){}; 在调用.设置的时候写: lunbo({ speed:200, wrapper:'#id', ease:'easing' }) 则,在方法内获取的时候: function lunbo(options){ var set=$.extend({},options); var _

jQuery lazyload 的重复加载错误以及修复方法_jquery

分析代码也可以知道. 最主要的原因是 写在页面上的 <img src="the_big_img_toLoad.jpg" />一经加载,就去向服务器申请图片地址,加载大图片. 如果想实现原定的效果,则 写在页面上的待加载地址 必须不能是大图片的地址,而我们可以将真正的图片地址数据 存储在alt属性中. 正确的例子如下: 复制代码 代码如下: <a href="#nogo"><img alt="http://www.jb51.ne

jQuery源码分析-04 选择器-Sizzle-工作原理分析_jquery

作者:nuysoft/高云 QQ:47214707 EMail:nuysoft@gmail.com 声明:本文为原创文章,如需转载,请注明来源并保留原文链接. 在分析Sizzle源码之前,先整理一下选择器的工作原理 先明确一些选择器中用到的名词,后边阅读时不会有歧义: 选择器表达式: "div > p" 块表达式: "div" "p" 并列选择器表达式: "div, p" 块分割器: Sizzle中的chunker正则,

jQuery的ready方法实现原理分析_jquery

jQuery中的ready方法实现了当页面加载完成后才执行的效果,但他并不是window.onload或者doucment.onload的封装,而是使用 标准W3C浏览器DOM隐藏api和IE浏览器缺陷来完成的,首先,我们来看jQuery的代码 DOMContentLoaded = function() { //取消事件监听,执行ready方法 if ( document.addEventListener ) { document.removeEventListener( "DOMContent

深入掌握Java技术EJB调用原理分析二

Home接口的Weblogic实现类的stub类 ((Hello Bean))_HomeImpl_WLStub(部署的时候动态生成字节码) Home接口的Weblogic实现类的skeleton类 ((Hello Bean))_HomeImpl_WLSkeleton(部署的时候动态生成字节码) Remote接口:Hello (用户编写) Remote接口的Weblogic实现类 ((Hello Bean))_EOImpl(EJBC生成) Remote接口的Weblogic实现类的stub类 ((

深入掌握Java技术EJB调用原理分析一

一个远程对象至少要包括4个class文件:远程对象:远程对象的接口:实现远程接口的对象的stub:对象的skeleton这4个class文件. 在EJB中则至少要包括10个class: Bean类,特定App Server的Bean实现类,Bean的remote接口,特定App Server的remote接口实现类,特定App Server的remote接口的实现类的stub类和skeleton类. Bean的home接口,特定App Server的home接口实现类,特定App Server的

jquery图片延迟加载 前端开发技能必备系列_jquery

目前,主要的购物网站都采用了这种加载方式.今天在一个网友的站里发现一个图片延迟加载的插件,很好用,在这里介绍一下. 先介绍一下图片延迟加载原理.我们需要先将图片的真实地址保存在一个自定义的属性中(属性名任你发挥吧,这里我用的是lazy-src),而图片的src属性中用一个占位图片来替代,这个占位图片当然是越小越好,它基本上只干活.不露面. 复制代码 代码如下: <img src="images/placeholder.png" lazy-src="images/real

jQuery中noconflict函数的实现原理分解_jquery

jQuery中,noconflict是用来防止变量冲突,用来释放变量控制权的一个重要方法.我们知道,jQuery中对外提供有两个全局变量,$和jQuery,虽然jQuery只产生了两个全局变量,极少情况下才会出现冲突,但是如果网页中如果包涵较多的类库,有自定义$或jQuery全局变量的存在时,就产生冲突. jQuery提供的noconflict函数很好的解决了变量冲突问题,无论是$或者jQuery冲突都可以解决,接下来我们就来分析一下jQuery的冲突处理. 先来看一下jQuery源码中noco