预览加载中,请您耐心等待几秒...
1/6
2/6
3/6
4/6
5/6
6/6

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

jquerylazyload延迟加载的实现原理分析jquerylazyload延迟加载的实现原理分析前言懒加载技术(简称lazyload)并不是新技术,它是js程序员对网页性能优化的一种方案。lazyload的核心是按需加载。在大型网站中都有lazyload的身影,例如谷歌的图片搜索页,迅雷首页,淘宝网,QQ空间等。因此掌握lazyload技术是个不错的.选择,可惜jquery插件lazyload官网(http://www.appelsiini.net/projects/lazyload)称不支持新版浏览器。lazyload在什么场合中应用比较合适?涉及到图片,falsh资源,iframe,网页编辑器(类似FCK)等占用较大带宽,且这些模块暂且不在浏览器可视区内,因此可以使用lazyload在适当的时候加载该类资源。避免网页打开时加载过多资源,让用户等待太久。如何实现lazyload?lazyload的难点在如何在适当的时候加载用户需要的资源(这里用户需要的资源指该资源呈现在浏览器可视区域)。因此我们需要知道几点信息来确定目标是否已呈现在客户区,其中包括:可视区域相对于浏览器顶端位置;待加载资源相对于浏览器顶端位置。在得到以上两点数据后,通过如下函数,便可得出某对象是否在浏览器可视区域了。返回浏览器的可视区域位置复制代码代码如下://返回浏览器的可视区域位置functiongetClient(){varl,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};}返回待加载资源位置复制代码代码如下://返回待加载资源位置functiongetSubClient(p){varl=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()返回目标模块区域信息。此时确定目标模块是否出现在客户区实际上是确定如上两个矩形是否相交。复制代码代码如下://判断两个矩形是否相交,返回一个布尔值functionintens(rec1,rec2){varlc1,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;returnMath.abs(lc1-lc2)<w1&&Math.abs(tc1-tc2)<h1;}现在基本上可以实现延时加载了,接下来,我们在window.onscroll事件中编写一些代码监控目标区域是否呈现在客户区。复制代码代码如下:复制代码代码如下:varp1=document.getElementById("p1");window.onscroll=function(){varprec1=getClient();varprec2=getSubClient(p1);if(intens(prec1,prec2)){alert("true");}};我们只需要在弹出窗口的地方加载我们需要的资源。这里值得注意的是:目标对象呈现在客户区域时,会随着滚动而不断的弹出窗口。因此我们需要在弹出第一个窗口后取消对该区域的监测,这里用一个数组来收集需要监测的对象,同时将监测的逻辑抽出来。同时需要注意onscroll事件和onresize事件都会改变游览器可视区域信息,因此在该类事件触发后需要重新计算,这里用autocheck()函数实现。增加元素:复制代码代码如下:复制代码代码如下://比较某个子区域是否呈现在浏览器区域functionjiance(arr,prec1,callback){varprec2;f