jQuery 插件开发——LazyLoadImg(预加载和延迟加载图片)

开发背景  



  本插件开发是近期写的最后一个插件了,接下来我想把最近研究的redis最为一个系列阐述下。当然Jquery插件开发是我个人爱好,我不会停止,在将来的开发中我会继续完善,当然也会坚持写这个系列的。

  每次开发我都会说一下开发插件中用的思想和自己在开发时候的想法。这篇开发也不例外,等会我会一一叙述。上一篇提到的是代码重构思想,这一篇我想谈的是同一个插件,不同的设计思想,得到同样效果。说的有点绕,简单的说就是殊途同归的意思。

LazyLoadImg 插件思想



  预加载和延迟加载这个说法想必大家都有所了解。WEB中的预加载就是在网页全部加载之前,对一些主要内容进行加载,以提供给用户更好的体验,减少等待的时间。说白了,就是在提前执行相关代码,提高用户体验。延迟加载(lazy load)是(也称为懒加载),延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。当然这两个思想对于图片来说,就是提前或是推迟加载图片。也就这个简单。

  刚刚说到同一插件不同思想的说法。那么我现在说说是啥意思。对于预加载图片(延迟加载同理),简单的说就是提前加载图片。既然是提前,很多人习惯的思想就是通过时间去控制加载图片,当然这样是可以的,但是对于不同的场景,都通过时间去控制,那并不一定是最好的方式。就拿本插件为例,如果你用时间去控制预加载的话是很困难的,其实延迟加载也是比较困难的,因为没有一个时间值比较合适,所以我这里使用滚动条滚动距离(离加载区域的距离)来计算的。

  通过滚动距离的一个好处就是易于控制,因为我们在滑动滚动条的时候可以立即知道自己滚动条离加载区域的距离,我们只要控制好这个距离就可以很简单的完成预加载和延迟加载这两种情况。既实现了功能,有简化了逻辑思路和代码。

  虽然这个插件很小,但是我还是用了标准的开发格式写了,其中也是使用了事件句柄、委托等思想,还有这两种思想,我之前的博文中也有详细说明过其优点。这里也不再累述。俗话说麻雀虽小,五脏俱全。这个插件就是这个意思了^_^

插件代码



  本插件属于简单插件,所以代码逻辑也很少,大家随意看看,都有注释,还是那句话,注释是一种良好习惯,希望各位猿们都对自己和别人负责,写好自己的代码注释。如果有不理解的或是有更好见解的,随时联系我。下面有我的QQ号。还有公共部分代码我就不再累述了,前几篇博文中都有相关代码,一看便知。

 1 /*
 2  *  instructions :lazyLoadImg
 3  *  date : 2014-10-27
 4  *  author : 张文书
 5  *  Last Modified 2014-10-17
 6  *  By 张文书
 7  */
 8 $(function () {
 9     ///说明:
10     ///     预加载图片和延迟加载图片
11     var lazyLoadImg = function () {
12         this.defaults = {
13             imgObjList: [],//可见区域需要设置元素的集合
14             lazyHeight: 100, //预加载高度(预判高度>0表示预加载;<0表示延迟加载)
15             hideSrcHost: "",//隐藏img的src地址
16         };
17         this.options = {};
18     };
19
20     lazyLoadImg.prototype = {
21         constructor: lazyLoadImg,
22         init: function (params) {
23             this.options = $.coverObject(this.defaults, params);
24             this._init();
25         },
26         _init: function () {
27             this._handleWindowScroll();//初始化加载
28             this._registerWindowScroll();
29         },
30         //说明:
31         //      注册window scroll事件
32         _registerWindowScroll: function () {
33             var handleEvent = $.delegate(this._handleWindowScroll, this);
34             $(window).scroll(handleEvent);
35         },
36         //说明:
37         //      window scroll事件句柄
38         _handleWindowScroll: function () {
39             var lazyHeight = this.options.lazyHeight;
40             var imgObjList = this.options.imgObjList;
41             var hideSrcHost = this.options.hideSrcHost;
42             if (imgObjList.length === 0) {
43                 return;
44             }
45             for (var i = 0; i < imgObjList.length; i++) {
46                 var objList = imgObjList[i];
47                 $.each(objList, function (j, v) {
48                     var id = $(v).attr("id");
49                     if (lazyLoadImg.prototype.boolGetObjList(id, lazyHeight)) {
50                         lazyLoadImg.prototype.setProperties(id, hideSrcHost);
51                     }
52                 });
53             }
54         },
55         //说明:
56         //      判断是否在可视区域情况  1.向上滚动超出可视区域, 2.向下滚动超出可视区域
57         boolGetObjList: function (id, lazyHeight) {
58             var scrollTop = $(window).scrollTop();
59             var itemTop = $(‘#‘ + id).outerHeight();
60             var itemOffsetTop = $(‘#‘ + id).offset().top;
61             var windowHeight = $(window).height();
62             //不在可视区域
63             if ((scrollTop - lazyHeight > (itemOffsetTop + itemTop)) || ((scrollTop + windowHeight) < itemOffsetTop - lazyHeight)) {
64                 return false;
65             }
66             return true;
67         },
68         //说明:
69         //      当满足在可见区域时候设置样式
70         setProperties: function (id, hideSrcHost) {
71             var imgHost = $("#" + id).attr(hideSrcHost);
72             var src = $("#" + id).attr("src");
73             if (imgHost == src) {
74                 return;
75             }
76             $("#" + id).attr("src", imgHost);
77         }
78     };
79     $.lazyLoadImg = new lazyLoadImg();
80 });

总结



  插件虽小,但是总结还是有必要的。本次插件开发呢,我最大的感触就是思想很重要。其实当时我开发的时候第一个念头就是用时间控制,当实现时候才发现,这种思路不是不能用,而是不好用。然后立即掉头,另寻他法。还好没有浪费啥太多时间。要知道,开发过程中,当项目很急的时候,一个思想的转换,是需要勇气的。所以,当我们在开发时候后,遇到想法上的问题时,我们不妨先放下当前所完成的,不要不舍得那写好的几句代码,说不定你后面想的好方法可以使你事半功倍呢。其实这很自然,因为你后来的想法是基于你当前的想法之上的。

  最后呢,如果有需要源码的或者想共同探讨的同仁,随时联系我,QQ:296319075 ,注明园友就好,同时也希望大家也能提出宝贵意见,不吝赐教。秉承共同探讨、共同进步!如有转载,请注明出处,谢谢!^_^

时间: 2024-12-14 04:01:06

jQuery 插件开发——LazyLoadImg(预加载和延迟加载图片)的相关文章

ViewPager+Fragment取消预加载(延迟加载)

在项目中,都或多或少地使用的Tab布局,所以大都会用到ViewPager+Fragment,但是Fragment有个不好或者太好的地方.例如你在ViewPager中添加了三个Fragment,当加载ViewPager中第一个Fragment时,它会默认帮你预先加载了第二个Fragment,当你加载第二个Fragment时,它会帮你加载第三个Fragment.这样虽然有时很好,但是用户只需看一个Fragment时,我们就做了一些多余工作加载了第二个Fragment.在这只需要取消Fragment的

js图片预加载与延迟加载

图片预加载的机制原理:就是提前加载出图片来,给前端的服务器有一定的压力. 图片延迟加载的原理:为了缓解前端服务器的压力,延缓加载图片,符合条件的时候再加载图片,当然不符合的条件就不加载图片.? 预加载的实现目的:为了实现更好的用户体验.劣势:会消耗前端服务器的性能. 延迟加载的实现目的:为了优化服务器前端的性能,减少请求次数. 实现方式: 1.第一种是纯粹的延迟加载,使用setTimeOut或setInterval进行加载延迟. 2.第二种是条件加载,符合某些条件,或触发了某些事件才开始异步下载

ViewPager+Fragment取消预加载(延迟加载)(转)

原文:http://www.2cto.com/kf/201501/368954.html 在项目中,都或多或少地使用的Tab布局,所以大都会用到ViewPager+Fragment,但是Fragment有个不好或者太好的地方.例如你在ViewPager中添加了三个Fragment,当加载ViewPager中第一个Fragment时,它会默认帮你预先加载了第二个Fragment,当你加载第二个Fragment时,它会帮你加载第三个Fragment.这样虽然有时很好,但是用户只需看一个Fragmen

[ html drawImage 图片预加载 ] canvas绘制图片 drawImage 属性实例演示之三--使用New Image()进行图片预加载

1 <!DOCTYPE html> 2 <html lang='zh-cn'> 3 <head> 4 <title>Insert you title</title> 5 <meta name='description' content='this is my page'> 6 <meta name='keywords' content='keyword1,keyword2,keyword3'> 7 <meta htt

图片预加载和懒加载

1.什么是预加载? 提前加载图片,当用户需要查看时可直接从本地缓存中渲染. 2:什么是懒加载? 延迟加载图片,当用户需要的时候再去加载图片 当我们访问一些类似电商网站,遇到图片很多情况下,需要浏览器去下载这些图片,遇到网速比较慢的时候,用户等待的时间特别长,造成很不好的用户体验.这样的话,就有可能导致一部分的用户没有耐心,而丢失这部分用户. 图片的预加载是提升用户体验而损失性能的一种做法,而懒加载的性能就比较好,所以将两个结合起来放到web程序中是一种不错的选择. 预加载 Image 对象在客户

封装的图片预加载,数据加载到浏览器底部加载数据

html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="jquery-1.8.3.min.js" type="text/javascript"></script> <style> *{ padding:0; margin:0

html5 app图片预加载

function Laimgload(){} //图片预加载JS Laimgload.prototype.winHeight = function(){ //计算页面高度 var winHeight = 0; //获取窗口高度 if (window.innerHeight){ winHeight = window.innerHeight; }else if ((document.body) && (document.body.clientHeight)) { winHeight = doc

图片的预加载之无序加载

当页面中图片很多的情况下,如果不做图片预加载,在图片没加载出来之前去访问,那用户看到的就是一片空白,影响用户体验, 这个时候图片预加载就非常重要了. 在进入主体页面之前先做一个loading出来,显示图片加载进度,加载完毕了再进入实际页面. 代码如下: HTML <div class="box"> <img src="http://pic29.photophoto.cn/20131231/0046043373506387_b.jpg" id=&qu

没错预加载就是这么简单

之前项目中遇到图片加载问题,首先想到异步加载 ,接着想用什么框架,框架很多,我用的是volley,感觉挺方便的,废话不多说,记录一下自己的错误然后接着前行,用volley的时候虽然出现了效果,但是在出现默认图片之前还是出现几秒让人难以忍受的空白,不得不靠. 上代码: /** 在刷屏页 创建任务: private void getData(){ ReadImgTask task = new ReadImgTask(); task.execute(); } 接着: /** * 预加载跑马灯图片 *