应一位朋友的邀请,尝试着写下这个貌似很热门的插件。昨天晚上构思了一下实现方式,结果没想到今天有点忙 ,断断续续写了点,初步实现了个非常简单的功能。
先写下我的想法,因为以前看过这方面的源码,实现思路一般两种,一种是打Domready与onload的时间差,不过这在webkit内核下行不通;一种是事先就修改src并添加其他属性(例如html5的data-xxx),所有浏览器都可以实现,缺点是这样用起来太麻烦,而且禁止js的话图片就不显示了。各有各的弊端吧。我本来设想是使用jquery的live方法在dom加载时动态委派事件,结果,事件是委派成功了,怎么执行是个问题 ,有哪位同学了解这方面麻烦留个言,不胜感谢(别说使用setTimeout··· )。
只好依据老方法先写了个简单的实例,等于先实现个原理,明天在完善封装下,
这段javascript代码位于头部,测试jquery的live方法以及方便你了解延迟加载的原理:
1 2 3 4 5 6 7 8 9 | $('img').live('click',function(){ //jquery的动态委派事件方法,即使是后来添加的标签,也会自动添加事件,也可以添加自定义事件 var s = $(window).scrollTop(); var t = $(this).offset().top; var h = s + $(window).height(); alert('当前屏幕距离滚动条顶部 '+s); alert('当前屏幕高度 '+h); alert('此img当前高度 '+t); }); |
然后html代码:
1 2 3 4 5 6 7 8 9 10 11 | <div style="width:256px;margin:0 auto;"> <img src="http://i.min.us/ib2Z2M.png" width="256" height="256"> <img src="http://i.min.us/ib2m1Q.png" width="256" height="256"> <img src="http://i.min.us/ib2o9Y.png" width="256" height="256"> <img src="http://i.min.us/ib6Bow.png" width="256" height="256"> <img src="http://i.min.us/ib2uYw.png" width="256" height="256"> <img src="http://i.min.us/ib6JKS.png" width="256" height="256"> <img src="http://i.min.us/ib6LTa.png" width="256" height="256"> <img src="http://i.min.us/ib2K7U.png" width="256" height="256"> <img src="http://i.min.us/ib7ju0.png" width="256" height="256"> </div> |
最后底部的javascript代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | var $imgs = $('img');//获取img对象 $imgs.each(function(){ $(this).data('src',$(this).attr('src'))//存储原来的src }).attr('src','s.gif').css('background','#fff url(\'load.gif\') no-repeat 50% 50%'); //修改src为1像素宽1像素高的透明gif图片,并设置背景为加载图片 function checkInWindow(){ $imgs.each(function(){ var $this=$(this) //循环获取img if($this.offset().top<($(window).scrollTop()+ $(window).height())){ //如果图片top小于窗口高度与当前窗口相对滚动条顶部高度之和(这句话好复杂.慢慢来) var src = $this.data('src');//获取src $this.attr('src',src).load(function(){ $this.css('background','none'); //赋值src并当图片load完成后去除背景加载图片 }); $imgs=$imgs.not($this.removeData('src'));//已显示的释放内存并退出img对象 } }) } checkInWindow();//在文档加载完成后先执行一次 $(window).scroll(checkInWindow);//注册滚动条滚动事件 |
想要它支持第二种方法,很简单,修改第三行为:
1 | $(this).data('src',$(this).attr('data-src')||$(this).attr('src'))//存储data-src或者src属性 |
现在进行封装,首先要实现不仅仅是dom下的所有图片,所以要有一个参数决定容器,然后是不能局限于滚动事件,要能实现jquery以及自定义事件,最后,要实现不仅仅是图片,甚至于是html代码。
未完成,有待调整,还有bug,当图片父对象有滚动条时就跳过了,周一再改吧,又写不完了
$.fn.lazyLoad=function(opt){
var options={
obj:'img', //延迟隐藏对象,默认是图片,也可以是表达式
沙发沙发,快过年了,赶紧更新吧。 ;a6
好的,耐心点,不要着急,休息,休息一下
知更鸟主题也自带这个效果,不知道大神这个如何。有个演示就好了
博主,兔年快乐!
看不懂啊。
嗯。确实不错。不知道完成了没呢。
谢谢楼主,虽然有些地方看不懂,但是还是受益匪浅,谢谢。不知楼主有没有适合新手的教程呢?谢谢
希望楼主有空多写点这样的文章,谢谢