开发背景  


  本插件开发是近期写的最后一个插件了,接下来我想把最近研究的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(预加载和延迟加载图片)的更多相关文章

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

    原文:http://www.2cto.com/kf/201501/368954.html 在项目中,都或多或少地使用的Tab布局,所以大都会用到ViewPager+Fragment,但是Fragmen ...

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

    在项目中,都或多或少地使用的Tab布局,所以大都会用到ViewPager+Fragment,但是Fragment有个不好或者太好的地方.例如你在ViewPager中添加了三个Fragment,当加载V ...

  3. javascript预加载和延迟加载

    延迟加载javascript,也就是页面加载完成之后再加载javascript,也叫on demand(按需)加载,一般有一下几个方法: What can your tired old page, o ...

  4. js图片预加载与延迟加载

    图片预加载的机制原理:就是提前加载出图片来,给前端的服务器有一定的压力. 图片延迟加载的原理:为了缓解前端服务器的压力,延缓加载图片,符合条件的时候再加载图片,当然不符合的条件就不加载图片.​ 预加载 ...

  5. js图片预加载以及延迟加载

    当我们需要做图片轮播的时候,如果让图片提前下载到本地,用浏览器缓存起来,我们可以用Image对象: function preLoadImg(){ var img=new Image(); img.sr ...

  6. jquery 中dataTable显示加载中,图片或文字

    引入js文件 <script type="text/javascript" src="${basePath}/lib/datatables/1.10.0/jquer ...

  7. js中的预加载与懒加载(延迟加载)

    js中加载分两种:预加载与延迟加载 一.  预加载,增强用户的体验,但会加载服务器的负担.一般会使用多种 CSS(background).JS(Image).HTML(<img />) . ...

  8. html5 app图片预加载

    function Laimgload(){} //图片预加载JS Laimgload.prototype.winHeight = function(){ //计算页面高度 var winHeight ...

  9. Javascript图片预加载详解

    预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布 ...

随机推荐

  1. xcode6下使用autolayout+sizeclass实践

    历史车轮滚滚向前,将autolayout配合sizeclass做布局的方式推上了主流,虽然有点晚,但最终还是进行了一次完整的实践,特此记录一下: 因为网上已经有很多博客介绍了autolayout配合s ...

  2. Linux下Wireshark普通用户不能获取网络接口问题

    Linux下Wireshark普通用户不能获取网络接口问题 1.安装setcap, setcap 是libcap2-bin包的一部分,一般来说,这个包默认会已经装好. sudo apt-get ins ...

  3. java数组 数组工具类Arrays

    一.数组 1.java有严格的数据类型限制,一个数组只能声明一个数据类型,存放同一种数据类型. 2.虽然只能存放一种数据类型,假设A , 如果数据类型B 继承A,依然能存放进入数组. 3.数组的初始化 ...

  4. AndroidUniversalImageLoader网络图片加载

    1.功能概要 Android-Universal-Image-Loader是一个开源的UI组件程序,该项目的目的是提供一个可重复使用的仪器为异步图像加载,缓存和显示. (1).使用多线程加载图片(2) ...

  5. C 函数指针数组

    名字有点绕口,其实更应该翻译为指针函数数组. 记录下对Head-First C这一节的理解,几乎每天班车上都会咪两眼,几乎每次都是看不懂,敲一敲的时候才有些明白. 通俗点讲,这功能解决的是,具有同种签 ...

  6. Silverlight OOB 程序自动更新

    Silverlight OOB 程序 提供了非常方便的自动更新功能! 要让 Silverlight OOB 安装到客户端电脑后实现自动更新,必须实现以下两个条件: 一.为 程序的 xap  文件进行签 ...

  7. sql中对查询出来的数据进行分页

    当sql中存储的数据量比较大时,在web中 数据显示时都会对数据进行分页,分页不会在客户端进行分页,而是在数据库查询过程中进行了分页. sql代码: DECLARE @pageindex INT; - ...

  8. 使用Delphi读取网络上的文本文件,html文件

    使用Delphi读取网络上的txt和html文件 可以使用两种方法: 1.下载文件,然后进行读取 下载文件的Delphi代码可以参考: http://www.delphibbs.com/delphib ...

  9. SQL大量数据查询的优化 及 非用like不可时的处理方案

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  10. 枚举N行N列的自然数列

    数据库环境:SQL SERVER 2005 现有一个需求,要枚举1-50个自然数,分10行5列展示.如图,