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图片预加载详解
预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布 ...
随机推荐
- Android 疑难杂症之获取listView Item上面组件的值
事实上思路就是又一次findById一次 获取当中组建的值.比方应用场景是 长按点击事件 获取目录名字 @Override public boolean onItemLongClick(Adapter ...
- PERFORMANCE_SCHEMA 详解
http://keithlan.github.io/2015/07/17/22_performance_schema/ http://www.markleith.co.uk/ http://www.c ...
- ccrendertexture
int bgHeight=150; CCSprite *sp=CCSprite::create("HelloWorld.png"); sp->setAnchorPoint(c ...
- JavaScript 应用开发 #4:切换任务的完成状态
在勾选了任务项目左边的对号(复选框)以后,会将任务的状态标记为已完成,取消勾选的话,又会把任务的状态标记为未完成.所以, 我们需要一个可以切换任务完成状态的方法.在任务模型里面,表示任务状态的属性是 ...
- 今天给大家分享一下Android中的资源与国际化的问题
摘要:该文章将向大家分享Android中的资源与国际化的问题. 今天给大家分享一下Android中的资源与国际化的问题,通常我们新建一个Android工程,目录结构如下图所示: 我们主要看一下layo ...
- WPF加载Winform窗体时 报错:子控件不能为顶级窗体
一.wpf项目中引用WindowsFormsIntegration和System.Windows.Forms 二.Form1.Designer.cs 的 partial class Form1 设置为 ...
- spring使用aop
基于spring-framework-4.1.7使用aop >>>>>>>>>>>>>>>>>&g ...
- 【bzoj1212】 [HNOI2004]L语言
题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构成.一个单词W也是由若干小写字母构成.一个字典D是若干个单词的 ...
- dhcp源码编译支持4G上网卡
1. tar xvzf dhcp-4.2.5-P1.tar.gz 2. ./configure --host=arm-linux ac_cv_file__dev_random=yes 3. vi bi ...
- oracle如何获取上个月的月份
--转载 这个要用到add_months()函数 参数 负数 代表 往前 正数 代表 往后.select to_char(add_months(trunc(sysdate),-1),'yyyymm ...