[转]javascript 懒加载技术(lazyload)简单实现

摘要:
当涉及占用大量带宽的图像、虚假资源、iframe、web编辑器等,并且这些模块暂时不在浏览器的查看区域中时,您可以使用lazyload在适当的时间加载这些资源。避免在打开网页时加载太多资源,这会让用户等待太久。3.如何实施lazyload?lazyload的难点在于如何在适当的时间加载用户所需的资源。

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

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

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

在得到以上两点数据后,通过如下函数,便可得出某对象是否在浏览器可视区域了.
//返回浏览器的可视区域位置
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 = "100px; height:3000px"></div>
<div id = "d1" style = "50px; height:50px; background:red;position:absolute; top:1000px">
</div>
var d1 = document.getElementById("d1");
window.onscroll = function(){
var prec1 = getClient();
var prec2 = getSubClient(d1);
if(intens(prec1,prec2)){
alert("true")
}
}

我们只需要在弹出窗口的地方加载我们需要的资源.
这里值得注意的是:目标对象呈现在客户区域时,会随着滚动而不断的弹出窗口.因此我们需要在弹出第一个窗口后取消对该区域的监测,这里用一个数组来收集需要监测的对象,同时将监测的逻辑抽出来。同时需要注意 onscroll事件和onresize事件都会改变游览器可视区域信息,因此在该类事件触发后需要重新计算,这里用autocheck()函数实现.(迅雷首页的lazyload没有在onresize事件中重新计算目标对象是否在浏览器可视区域,因此如果先将浏览器窗口缩小到一定尺寸后滚动到需要加载图片的区域后点击最大化,图片加载不出来,呵呵,以后需要注意了).

增加元素:<div id = "d2" style = "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();
}

现在我们只需要在弹窗的地方加载我们需要的资源了.源码就不贴出来了.如果需要的朋友,或着存在疑问的地方,可以联系我.

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

免责声明:文章转载自《[转]javascript 懒加载技术(lazyload)简单实现》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ubuntu的docker镜像中安装ifconfig和ping命令Win7启动修复(Ubuntu删除后进入grub rescue的情况)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

lazyload.js详解

lazyload.js详解 简介 lazyload.js用于长页面图片的延迟加载,视口外的图片会在窗口滚动到它的位置时再进行加载,这是与预加载相反的。 优点: 它可以提高页面加载速度; 在某些情况清晰它也可以帮助减少服务器负载。 安装 bower安装: $ bower install jquery.lazyload npm安装: $ npm...

lazyload懒加载和swiper轮播懒加载的用法

对于有较多的图片的网页,使用图片延迟加载,能有效的提高页面加载速度,比如商城网页。 lazyload使用方法: 载入 JavaScript 文件: <script src="jquery.js"></script> <script src="jquery.lazyload.js"></script> 修改 H...

对于富文本编辑器中使用lazyload图片懒加载

使用lazyload.js图片懒加载的作用是给用户一个好的浏览体验,同时对服务器减轻了压力,当用户浏览到该图片的时候再对图片进行加载,项目中使用lazyload的时候需要将图片加入data-orginal的属性表明图片的路径,但是目前在做的项目中使用的是用户自己编辑的内容,不能对这些内容做修改,于是只能是在浏览的时候用js多加一段操作实现这个功能了, 在文...

页面图片懒加载、延迟加载(lazyload)

文档:http://www.h-ui.net/lib/jQuery.lazyload.js.shtml github地址:https://github.com/jieyou/lazyload Lazy Load是一个用js编写的jQuery插件,用来实现图片的延迟加载。只有在浏览器可视区域的图片才会被加载,没有滚动到的区域img标签上会有一个占位图片,而真...

懒加载和预加载---性能优化

懒加载 认识 懒加载是一种按需延迟资源的方式。在加载显示页面时,并不一次性加载所有该页面所需要的图像,对于在可视区域之外的图像,可以等到用户scroll到该区域的时候,再进行加载 实现方式 1、目前已经有很多库实现了懒加载,例如lazysizes,可以考虑使用 2、使用库这样的操作,相当于增加一个需要请求的js文件,增加一次http请求。所以如果能够实现原...

ImagesLazyLoad 图片延迟加载效果

ImagesLazyLoad 图片延迟加载效果   之前在做一个图片浏览效果时,要看后面的小图必须等到前面的加载完,而且大图的位置是在大量的小图后面,导致大图要等到小图都加载完才能显示,为了解决这个问题,就想到了Lazyload效果。 现在很多网站都用了类似的效果,如淘宝、Bing等。 这个图片延迟加载效果是在Lazyload的基础上扩展的,主要扩展了...