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: ,注明园友就好,同时也希望大家也能提出宝贵意见,不吝赐教。秉承共同探讨、共同进步!如有转载,请注明出处,谢谢!^_^
转自:http://www.cnblogs.com/mzws/p/LazyLoadImg.html
JQUERY 插件开发——LAZYLOADIMG(预加载和延迟加载图片)的更多相关文章
- ViewPager+Fragment取消预加载(延迟加载)(转)
原文:http://www.2cto.com/kf/201501/368954.html 在项目中,都或多或少地使用的Tab布局,所以大都会用到ViewPager+Fragment,但是Fragmen ...
- ViewPager+Fragment取消预加载(延迟加载)
在项目中,都或多或少地使用的Tab布局,所以大都会用到ViewPager+Fragment,但是Fragment有个不好或者太好的地方.例如你在ViewPager中添加了三个Fragment,当加载V ...
- javascript预加载和延迟加载
延迟加载javascript,也就是页面加载完成之后再加载javascript,也叫on demand(按需)加载,一般有一下几个方法: What can your tired old page, o ...
- js图片预加载与延迟加载
图片预加载的机制原理:就是提前加载出图片来,给前端的服务器有一定的压力. 图片延迟加载的原理:为了缓解前端服务器的压力,延缓加载图片,符合条件的时候再加载图片,当然不符合的条件就不加载图片. 预加载 ...
- js图片预加载以及延迟加载
当我们需要做图片轮播的时候,如果让图片提前下载到本地,用浏览器缓存起来,我们可以用Image对象: function preLoadImg(){ var img=new Image(); img.sr ...
- jquery 中dataTable显示加载中,图片或文字
引入js文件 <script type="text/javascript" src="${basePath}/lib/datatables/1.10.0/jquer ...
- js中的预加载与懒加载(延迟加载)
js中加载分两种:预加载与延迟加载 一. 预加载,增强用户的体验,但会加载服务器的负担.一般会使用多种 CSS(background).JS(Image).HTML(<img />) . ...
- html5 app图片预加载
function Laimgload(){} //图片预加载JS Laimgload.prototype.winHeight = function(){ //计算页面高度 var winHeight ...
- Javascript图片预加载详解
预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布 ...
随机推荐
- 九度OJ 题目1384:二维数组中的查找
/********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...
- HDU2149-Good Luck in CET-4 Everybody!(博弈,打表找规律)
Good Luck in CET-4 Everybody! Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- NVMe 图解
http://www.ssdfans.com/?p=1143#rd&sukey=3997c0719f151520989740bb972a716fdb2dbab623808d16acd5075b ...
- How and Why Unsafe is Used in Java---reference
By Peter Lawrey https://www.voxxed.com/blog/2014/12/how-and-why-unsafe-is-used-in-java/ Overview sun ...
- android开发之bitmap使用
bitmap是android中重要的图像处理工具类,通过bitmap可以对图像进行剪切.旋转.缩放等操作,同时还可以指定格式和压缩质量保存图像文件. 一.拿到一个Bitmap对象 查看源码我们知道,B ...
- android开发之手势识别
由于精确度等原因,手势识别在android中用的并不多,不过这并不妨碍我们来玩玩这个神奇的玩意. 在android中要使用手势,先得建立手势库,建立手势库非常简单,新建一个android sample ...
- Java基础知识强化之IO流笔记22:FileInputStream / FileOutputStream 复制文本文件案例1
1. 使用字节流FileInputStream / FileOutputStream 复制文本文件案例: 分析: (1)数据源:从哪里来 a.txt -- 读取数据 -- FileInpu ...
- RedHat7配置IdM server
IdM服务器是一个集成身份验证服务器. Figure 1.1. The IdM Server: Unifying Services Authentication: Kerberos KDC Kerbe ...
- 在DropDownList里显示多级分类
protected void ddlBind() { DataTable dt = new DataTable(); ddlCategoryId.DataSource = getList(" ...
- microchip PIC芯片使用方法
pickit3调试器使用: http://www.eeboard.com/evaluation/pickit3debug/1/ MPLAB环境使用: 1.代码折叠功能 2.代码补全功能 3.函数跳转功 ...