jquery图片延迟加载 前端开发技能必备系列


Posted in Javascript onJune 18, 2012

目前,主要的购物网站都采用了这种加载方式。今天在一个网友的站里发现一个图片延迟加载的插件,很好用,在这里介绍一下。
先介绍一下图片延迟加载原理。我们需要先将图片的真实地址保存在一个自定义的属性中(属性名任你发挥吧,这里我用的是lazy-src),而图片的src属性中用一个占位图片来替代,这个占位图片当然是越小越好,它基本上只干活、不露面。

<img src="images/placeholder.png" lazy-src="images/realimg.jpg" alt="" /> 
<!-- 如果浏览器禁用了js,我们也不能不让网页显示图片撒,所以最好是加上下面一句备用代码 --> 
<noscript><img src="images/realimg.jpg" alt="" /></noscript>

首先。页面开始加载时浏览器会获取所有图片在当前页面中的位置并缓存(获取offset的值时,页面的reflow会被引发),计算出可视区域,当图片的位置出现在可视区域中,利用js动态地将图片标签中的src值替换成图片真实的地址,这时,刚刚出现在可视区域的图片便开始加载。
其次。当用户向下滚动页面时,通过js再次计算是否有图片初次出现可视区域内,如果有,刚对这些图片的src值进行替换,并开始加载真实图片。为了避免重复操作引起的内存泄漏,需要在全部图片加载完后,卸载掉相应的触发事件。
最后。本文是将整个窗口看成是一个大容器,如果愿意,也可以在页面中设置一个小容器,在小容器中也同样可以实现图片的延迟加载。原理虽然简单,但是应用是多样的。
从下面的地址可以看到图片延迟加载的演示,不过尽量使用相应的工具(firebug、Fiddler2)监测图片延迟加载的效果。
图片延迟加载插件的代码如下:
图片延迟加载插件代码 
(function( $ ){ 
$.fn.imglazyload = function( options ){ 
var o = $.extend({ 
attr : 'lazy-src', 
container : window, 
event : 'scroll', 
fadeIn : false, 
threshold : 0, 
vertical : true 
}, options ), 
event = o.event, 
vertical = o.vertical, 
container = $( o.container ), 
threshold = o.threshold, 
// 将jQuery对象转换成DOM数组便于操作 
elems = $.makeArray( $(this) ), 
dataName = 'imglazyload_offset', 
OFFSET = vertical ? 'top' : 'left', 
SCROLL = vertical ? 'scrollTop' : 'scrollLeft', 
winSize = vertical ? container.height() : container.width(), 
scrollCoord = container[ SCROLL ](), 
docSize = winSize + scrollCoord; 
// 延迟加载的触发器 
var trigger = { 
init : function( coord ){ 
return coord >= scrollCoord && 
coord <= ( docSize + threshold ); 
}, 
scroll : function( coord ){ 
var scrollCoord = container[ SCROLL ](); 
return coord >= scrollCoord && 
coord <= ( winSize + scrollCoord + threshold ); 
}, 
resize : function( coord ){ 
var scrollCoord = container[ SCROLL ](), 
winSize = vertical ? 
container.height() : 
container.width(); 
return coord >= scrollCoord && 
coord <= ( winSize + scrollCoord + threshold ); 
} 
}; 
var loader = function( triggerElem, event ){ 
var i = 0, 
isCustom = false, 
isTrigger, coord, elem, $elem, lazySrc; 
// 自定义事件只要触发即可,无需再判断 
if( event ){ 
if( event !== 'scroll' && event !== 'resize' ){ 
isCustom = true; 
} 
} 
else{ 
event = 'init'; 
} 
for( ; i < elems.length; i++ ){ 
isTrigger = false; 
elem = elems[i]; 
$elem = $( elem ); 
lazySrc = $elem.attr( o.attr ); 
if( !lazySrc || elem.src === lazySrc ){ 
continue; 
} 
// 先从缓存获取offset值,缓存中没有才获取计算值, 
// 将计算值缓存,避免重复获取引起的reflow 
coord = $elem.data( dataName ); 
if( coord === undefined ){ 
coord = $elem.offset()[ OFFSET ]; 
$elem.data( dataName, coord ); 
} 
isTrigger = isCustom || trigger[ event ]( coord ); 
if( isTrigger ){ 
// 加载图片 
elem.src = lazySrc; 
if( o.fadeIn ){ 
$elem.hide().fadeIn(); 
} 
// 移除缓存 
$elem.removeData( dataName ); 
// 从DOM数组中移除该DOM 
elems.splice( i--, 1 ); 
} 
} 
// 所有的图片加载完后卸载触发事件 
if( !elems.length ){ 
if( triggerElem ){ 
triggerElem.unbind( event, fire ); 
} 
else{ 
container.unbind( o.event, fire ); 
} 
$( window ).unbind( 'resize', fire ); 
elems = null; 
} 
}; 
var fire = function( e ){ 
loader( $(this), e.type ); 
}; 
// 绑定事件 
container = event === 'scroll' ? container : $( this ); 
container.bind( event, fire ); 
$( window ).bind( 'resize', fire ); 
// 初始化 
loader(); 
return this; 
}; 
})( jQuery );

有关这个的插件API说明如下:
attr string
存放图片真实地址的属性名,与HTML对应,默认是lazy-src。
container dom & selector
默认的容器为window,可自定义容器。
event stirng
触发图片加载的事件类型,默认为window.onscroll事件
fadeIn boolean
是否使用jQuery的fadeIn效果来显示,默认是false。
threshold number
页面滚动到离图片还有指定距离的时候就进行加载,默认是0。
vertical boolean
是否横向滚动,默认为true(纵向)。
loadScript(增强版的功能) boolean
是否无阻塞加载javascript广告图片,默认为false。

注:转载请注明出处。作者:爱莲学堂

Javascript 相关文章推荐
Javascript之旅 对象的原型链之由来
Aug 25 Javascript
深入探寻seajs的模块化与加载方式
Apr 14 Javascript
ECMAScript6中Set/WeakSet详解
Jun 12 Javascript
判断数组是否包含某个元素的js函数实现方法
May 19 Javascript
BootStrap 可编辑表Table格
Nov 24 Javascript
jquery pagination插件动态分页实例(Bootstrap分页)
Dec 23 Javascript
IE11下使用canvas.toDataURL报SecurityError错误的解决方法
Nov 19 Javascript
基于node简单实现RSA加解密的方法步骤
Mar 21 Javascript
JavaScript使用ul中li标签实现删除效果
Apr 15 Javascript
理理Vue细节(推荐)
Apr 16 Javascript
jQuery使用ajax传递json对象到服务端及contentType的用法示例
Mar 12 jQuery
vue实现页面切换滑动效果
Jun 29 Javascript
jquery不会自动回收xmlHttpRequest对象 导致了内存溢出
Jun 18 #Javascript
Jquery上传插件 uploadify v3.1使用说明
Jun 18 #Javascript
uploadify 3.0 详细使用说明
Jun 18 #Javascript
通过Javascript创建一个选择文件的对话框代码
Jun 16 #Javascript
通过Javascript将数据导出到外部Excel文档的函数代码
Jun 15 #Javascript
精心挑选的15个jQuery下拉菜单制作教程
Jun 15 #Javascript
jQuery操作input type=radio的实现代码
Jun 14 #Javascript
You might like
yii操作cookie实例简介
2014/07/09 PHP
PHP实现批量上传单个文件
2015/12/29 PHP
用js实现的仿sohu博客更换页面风格(简单版)
2007/03/22 Javascript
javascript 用函数语句和表达式定义函数的区别详解
2014/01/06 Javascript
Window.Open如何在同一个标签页打开
2014/06/20 Javascript
js输出数据精确到小数点后n位代码
2016/07/02 Javascript
javascript中href和replace的比较(详解)
2016/11/25 Javascript
jquery.masonry瀑布流效果
2017/05/25 jQuery
微信小程序实现页面下拉刷新和上拉加载功能详解
2018/12/03 Javascript
详解ES6中的Map与Set集合
2019/03/22 Javascript
Vue Cli 3项目使用融云IM实现聊天功能的方法
2019/04/19 Javascript
layui+jquery支持IE8的表格分页方法
2019/09/28 jQuery
vue.js实现左边导航切换右边内容
2019/10/21 Javascript
vue基础知识--axios合并请求和slot
2020/06/04 Javascript
JavaScript语句错误throw、try及catch实例解析
2020/08/18 Javascript
Python网页解析利器BeautifulSoup安装使用介绍
2015/03/17 Python
浅析Python中的多条件排序实现
2016/06/07 Python
解决Python字典写入文件出行首行有空格的问题
2017/09/27 Python
有关Python的22个编程技巧
2018/08/29 Python
将pandas.dataframe的数据写入到文件中的方法
2018/12/07 Python
django2笔记之路由path语法的实现
2019/07/17 Python
python [:3] 实现提取数组中的数
2019/11/27 Python
python正则表达式匹配IP代码实例
2019/12/28 Python
Python解释器以及PyCharm的安装教程图文详解
2020/02/26 Python
基于python实现数组格式参数加密计算
2020/04/21 Python
python中rc1什么意思
2020/06/19 Python
很酷的HTML5电子书翻页动画特效
2016/02/25 HTML / CSS
英国手机零售商:Metrofone
2019/03/18 全球购物
德国最大的网上足球商店:11teamsports
2019/09/11 全球购物
飞利信loadrunner和软件测试笔试题
2012/09/22 面试题
学习党的群众路线剖析材料
2014/10/09 职场文书
小学少先队活动总结
2015/05/08 职场文书
2015年教研员工作总结
2015/05/26 职场文书
关于感恩老师的古诗句
2019/08/20 职场文书
聊聊Python String型列表求最值的问题
2022/01/18 Python
Mysql表数据比较大情况下修改添加字段的方法实例
2022/06/28 MySQL