`
zpopopo
  • 浏览: 9622 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

分享前端数据延迟加载的jQuery插件设计教程

阅读更多
http://www.xueit.com/js/show-6728-1.aspx

背景
最近看到很多网站都运用到了一种前端数据延迟加载技术,包括淘宝,新浪网等等,这样做的目的可以使得一些未显示的图片随 着滚动条的滚动进行延迟显示。
好处显而易见,可以减少前端对于图片的Http请求,减轻对于服务器的压力,对于长篇并且大批量的图片的网页很有帮助。

详细分析
1. 今天就来介绍如何设计这样的一种jQuery插件。
jQuery官方也开放一个Lazyload插件,但是用了一下,发现它 有些问题,在网页加载的时候(具体地址可以参考这个Demo:http://www.appelsiini.net/projects/lazyloa d/enabled_container.html),利用HttpWatch可以发现,六张图片其实都有在下载,只是在下载过程中,他会将src路径转换 为orginal路径,当转换为orginal路径时,http请求就会被终止(Aborted),如果拉动滚动条,它会把original路径再转换为src的 路径。同时可以在HttpWatch中观察到它获取得到一个206的HttpCode,206协议是Partial Content,也就是服务端只接收到了部分Http请求。因此,在图片尺寸比较大的情况下,图片加载较慢,因此请求会被拦截,并且保留客户端数据,在下次Img标签加载Load方法的时候,可以继续请求图片数据。HttpWatch查看效果如下:

图上有3个图片的Http请求被终止。

2. 如果我想让它在网页加载的时候,只要没显示的图片,就不要让它去调用请求,那么该如何实现呢?那么开始以下我的设计。
首先,我们考虑到一个Img标签如果具有src属性,并且已经在 Html加载出来的时候,会自动去请求服务端,甚至<img src=” ” />都会去请求服务端。所以,在你加载具有src路径的图片之前,必须让它不被加载,我这里使用到的一个技巧,将包含Img 标签的DOM元素全仍进一个Textarea文本框中,这样就不会去请求路径。
jQuery插件代码:
//包装延迟加载容器
$.fn.wraplazyload = function(value) {
    this.html('<textarea class="text-lazyload">' + value + '</textarea>');
};
其中将text-lazyload的display设置为none,让它不显示。
接着,我需要开始“解放”图片了
jQuery插件代码:
var content = $('<div>' + $(this).val().replace (/src=/gi, 'dynamic=') + '</div>');
$(this).after(content);
这里的this指的是刚才包装的textarea,这里首先把Html内容 的包含“src=”的文本替换为“dynamic=” (注:这里简单进行 这样的替换,如果一般性的考虑的话),
然后创建一个jQuery对象,在textarea后面追加这样的一个DOM 节点。利用dynamic的替代属性,就防止了图片的加载。

3. 该jQuery插件不尽支持对于Img图片的延迟加载,对于任何 一个DOM节点都可以进行延迟加载。
jQuery插件代码:
element.each(function() { $(this).css('visibility', 'hidden'); });
element为一系列DOM元素或者Img标签,注意这里要使用 visibility:hidden,这样才能保持DOM元素或者Img标签的高度,display:none,会将元素的高度置0.

4. 然后,开始编写滚动条触发事件代码:
jQuery插件代码:
Code [http://www.xueit.com]
$(settings.container).bind(settings.event, function(event) {

    var pixel = 0;
    if (settings.position == 'vertical') {
        pixel = $(settings.container).height()   $(settings.container).scrollTop();
    }
    else if (settings.position == 'horizontal') {
        pixel = $(settings.container).width()   $(settings.container).scrollLeft();
    }

    element.each(function() {
        if ($(this).css('visibility') != 'visible' &&
            (settings.position == 'vertical' && pixel >= $(this).offset().top
                || settings.position == 'horizontal' && pixel >= $(this).offset().left)) {

            $(this).css('visibility', 'visible');

            if (settings.effect == 'fadeIn') {
                $(this).hide();
                $(this)[settings.effect](settings.effectTime);
            }
            if (settings.loadType == 'item')
                $(this).html($(this).html().replace(/dynamic=/gi, 'src='));
            else if (settings.loadType == 'image')
                $(this).attr('src', $(this).attr('dynamic')).removeAttr('dynamic');
        }
    });
});
当滚动条将图片或者DOM节点给展示出来的时候,会调用$(this).css('visibility', 'visible');
并且如果是加载图片,将调用$(this).attr('src', $(this).attr('dynamic')).removeAttr('dynamic');
如果是加载Dom节点,将调用$(this).html($(this).html ().replace(/dynamic=/gi, 'src='));
思路是将dynamic转换为src,得以进行Http请求。
5. 最后看代码如何应用该插件:
前端JS代码:
Code [http://www.xueit.com]
var html = '';
html  = '<div class="item-lazyload"><img src="http://img9.zol.com.cn/desk_pic/big_152/151653.jpg" width="600" height="500" /><br/><img src="http://img9.zol.com.cn/desk_pic/big_413/412107.jpg" width="600" height="500" /></div>';
html  = '<div class="item-lazyload"><img src="http://img9.zol.com.cn/desk_pic/big_152/151656.jpg" width="600" height="500" /></div>';
html  = '<div class="item-lazyload"><img src="http://img9.zol.com.cn/desk_pic/big_413/412108.jpg" width="600" height="500" /></div>';
html  = '<div class="item-lazyload"><img src="http://img9.zol.com.cn/desk_pic/big_419/418139.jpg" width="600" height="500" /></div>';
html  = '<div class="item-lazyload"><img src="http://img9.zol.com.cn/desk_pic/big_152/151647.jpg" width="600" height="500" /></div>';
$('#container2').wraplazyload(html);
$('#container2').datalazyload({ loadType: 'image', effect: 'fadeIn'/*, position: 'horizontal'*/ });
Html代码:
Code [http://www.xueit.com]
<div id="container2">
</div>
首先对于container2节点进行包装,然后调用datalazyload方 法,这里loadType加载类型为加载图片“image”,也可以设置为 加载DOM节点“item”,effect为加载效果,position可以设置为 水平加载还是垂直加载,Options参数完整为:
jQuery插件代码:
Code [http://www.xueit.com]
var settings = {
    dataContainer: '.text-lazyload',
    dataItem: '.item-lazyload',
    loadType: 'item',                   //可以为item(条目加载),img(图片加载)
    container: window,                  //滚动的容器
    event: 'scroll',
    effect: 'normal',                   //效果类型
    effectTime: 1000,                   //效果持续时间
    position: 'vertical'                //可以为vertical(垂直加载),horizontal(水平加载)
};
这些参数都是可设置的,这里不在过多介绍,具体可以查看源代码。
6. 最后,插件只有在滚动条拉到DOM节点或者图片的可视区域的时候,才进行加载,达到了数据延迟加载的效果。该插件已经成功应用到项目中去了.
数据延迟加载JQuery插件的演示地址:http://aspspider.info/sunleepy/lazyload.html
源代码下载
分享到:
评论
1 楼 superman_wc 2011-11-17  
好像对于<iframe> 有Bug啊, 加在<textarea>里的 iframe 就没加载内容了哦!

能看看这个问题怎么解决吗?

相关推荐

    前端项目-jquery.lazyloadxt.zip

    前端项目-jquery.lazyloadxt,Lazy Load XT是一个面向移动的、快速可扩展的jquery插件,用于延迟加载图像、视频和其他媒体,内置jquery mobile框架支持。它通过只加载可见的媒体元素来提高网站的性能,折叠下的元素在...

    前端项目-jquery.lazy.zip

    前端项目-jquery.lazy,Lazy是一个快速、功能丰富、轻量级的jquery延迟内容加载插件。它的设计目的是通过只在视图中加载内容来加快页面加载时间并减少用户的流量。

    前端项目-jquery.fancytree.zip

    前端项目-jquery.fancytree,FancyTree是jQuery的一个javascript树视图插件,支持持久性、键盘、复选框、拖放和延迟加载。

    jQuery lazyload

    延迟加载图片的jQuery插件

    Exopite-Lazy-Load-XT-WordPress-Plugin:Exopite Lazy Load XT使用Ressio Lazy Load XT jQuery插件延迟加载图像,视频和iframe

    Exopite Lazy Load XT使用Ressio Lazy Load XT jQuery插件延迟加载图像,视频和iframe。 作者:乔·萨莱(Joe Szalai) 版本:20190521 插件URL: : 作者网址: : 许可证:GNU通用公共许可证v3或更高版本 许可...

    jQuery详细教程

    jQuery详细教程,讲解很透彻, 一. jQuery 语法实例 $(this).hide() 演示 jQuery hide() 函数,隐藏当前的 HTML 元素。 $("#test").hide() 演示 jQuery hide() 函数,隐藏 id="test" 的元素。 $("p").hide() ...

    jQuery权威指南-源代码

    其次详细讲解了jQuery的各种选择器、jQuery操作DOM的方法、jQuery中的事件与应用、jQuery中的动画和特效、Ajax在jQuery中的应用,以及各种常用的jQuery插件的使用方法和技巧,所有这些知识点都配有完整的示例(包括...

    jQuery基础教程(第四版)

    第13章将带领读者深入理解Ajax相关的概念,包括jQuery的延迟处理机制,从而实现等待数据在一段时间后可用时再对其进行处理。 附录A将帮助读者理解闭包——什么是闭包,怎么利用闭包。 附录B向读者介绍使用jQUnit库对...

    H-ui.admin 前端框架

    H-ui.admin是用H-ui前端框架开发的轻量级网站后台模版 ...│ Echo.js 图片延迟加载插件 │ colpick.js 颜色插件 │ handlebars.js js模版引擎 │ waterfall.min.js 瀑布流插件 └─temp 测试数据、图片

    javaweb网上淘书吧源码

    4. 前端使用JSP、jQuery、BootStrap实现用户交互界面 5. 购物车、订单等业务流程实现 6. 权限控制和安全管理机制 7. 文件上传、支付接口接入等功能实现 8. 数据库读写分离、图片延迟加载等技术使用 该项目实现...

    进度条小插件特效.zip

    效果为windows音频进度特效,进度修改即可使用,里面有延迟和加载事件限制,如有问题及时交流

    python入门到高级全栈工程师培训 第3期 附课件代码

    07 jquery扩展与插件 08 jquery扩展补充 09 本周作业轮播图以及思路 第45章 轮播图片css部分 轮播图片js部分 第46章 01 数据库与dbms的概念 02 sql规范 03 数据库操作DDL 04 python s3 day46 mysql的数据类型 05...

    terseBanner:适合初学者的简化横幅插件

    TerseBanner适合前端新手的简化版轮播插件特色介绍自动合并横幅广告需要的某些元素,简化原始DOM结构,简化操作方法默认动画模式下,不相邻的项在切换时不会出现其他项默认动画是slide,只能在水平方向滑动可以使用...

Global site tag (gtag.js) - Google Analytics