一段实现页面上的图片延时加载的js代码


Posted in Javascript onFebruary 11, 2010

相关地址:
http://list.taobao.com/browse/30-50029375/n-1----------------------0---------yes-------g,ge3denzxhazdumzsgy3tsnzq-----------------------42-grid-commend-0-all-50029375.htm?TBG=14153.14.7&ssid=r18-s18

http://shop.qq.com/shopList.html
大家如果使用firebug去查看的话就会发现,当你滚动到相应的行时,当前行的图片才即时加载的,这样子的话页面在打开只加可视区域的图片,而其它隐藏的图片则不加载,一定程序上加快了页面加载的速度,对于比较长的页面来说,这个方案是比较好的。
实现原理

把所有需要延时加载的图片改成如下的格式:

<img lazy_src="图片路径" border="0"/>

然后在页面加载时,把所有使用了lazy_src的图片都保存到数组里,然后在滚动时计算可视区域的top,然后把延时加载的图片中top小于当前可视区域(即图片出现在可视区域内)的图片的src的值用lazy_src的来替换(加载图片)

代码

lazyLoad=(function() { 
var map_element = {}; 
var element_obj = []; 
var download_count = 0; 
var last_offset = -1; 
var doc_body; 
var doc_element; 
var lazy_load_tag; 
function initVar(tags) { 
doc_body = document.body; 
doc_element = document.compatMode == 'BackCompat' ? doc_body: document.documentElement; 
lazy_load_tag = tags || ["img", "iframe"]; 
}; 
function initElementMap() { 
var all_element = []; 
//从所有相关元素中找出需要延时加载的元素 
for (var i = 0, 
len = lazy_load_tag.length; i < len; i++) { 
var el = document.getElementsByTagName(lazy_load_tag[i]); 
for (var j = 0, 
len2 = el.length; j < len2; j++) { 
if (typeof(el[j]) == "object" && el[j].getAttribute("lazy_src")) { 
element_obj.push(all_element[key]); 
} 
} 
} for (var i = 0, 
len = element_obj.length; i < len; i++) { 
var o_img = element_obj[i]; 
var t_index = getAbsoluteTop(o_img);//得到图片相对document的距上距离 
if (map_element[t_index]) { 
map_element[t_index].push(i); 
} else { 
//按距上距离保存一个队列 
var t_array = []; 
t_array[0] = i; 
map_element[t_index] = t_array; 
download_count++;//需要延时加载的图片数量 
} 
} 
}; 
function initDownloadListen() { 
if (!download_count) return; 
var offset = (window.MessageEvent && !document.getBoxObjectFor) ? doc_body.scrollTop: doc_element.scrollTop; 
//可视化区域的offtset=document的高+ 
var visio_offset = offset + doc_element.clientHeight; 
if (last_offset == visio_offset) { 
setTimeout(initDownloadListen, 200); 
return; 
} 
last_offset = visio_offset; 
var visio_height = doc_element.clientHeight; 
var img_show_height = visio_height + offset; 
for (var key in map_element) { 
if (img_show_height > key) { 
var t_o = map_element[key]; 
var img_vl = t_o.length; 
for (var l = 0; l < img_vl; l++) { 
element_obj[t_o[l]].src = element_obj[t_o[l]].getAttribute("lazy_src"); 
} 
delete map_element[key]; 
download_count--; 
} 
} 
setTimeout(initDownloadListen, 200); 
}; 
function getAbsoluteTop(element) { 
if (arguments.length != 1 || element == null) { 
return null; 
} 
var offsetTop = element.offsetTop; 
while (element = element.offsetParent) { 
offsetTop += element.offsetTop; 
} 
return offsetTop; 
} 
function init(tags) { 
initVar(tags); 
initElementMap(); 
initDownloadListen(); 
}; 
return { 
init: init 
} 
})();

使用方法:把页面上需要延时加载的图片src改成为lazy_src,然后把上面的js放到body最后面,然后调用:lazyLoad.init();
调戏的方法可以使用firebug来查看一时图片是否是延时加载。
另外:
如果你的页面上存在有内容切换的栏目的话,可能在切换时切换的内容里的图片可能会不显示,处理的方法是在内容时单独图片加载处理,如:
///切换内容的代码... 
chlid.find("img[init_src]").each(function(){ 
$(this).attr("src",$(this).attr("init_src")); 
$(this).removeAttr("init_src"); 
});
Javascript 相关文章推荐
JavaScript 应用类库代码
Jun 02 Javascript
jquery 选择器引擎sizzle浅析
Feb 06 Javascript
javascript模块化是什么及其优缺点介绍
Sep 02 Javascript
jquery判断类型是不是number类型的实例代码
Oct 07 Javascript
微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解
Dec 08 Javascript
setTimeout函数的神奇使用
Feb 26 Javascript
对象不支持indexOf属性或方法的解决方法(必看)
May 28 Javascript
JavaScrpt判断一个数是否是质数的实例代码
Jun 11 Javascript
Node.js中sequelize时区的配置方法
Dec 10 Javascript
MVVM框架下实现分页功能示例
Jun 14 Javascript
微信小程序实现倒计时补零功能
Jul 09 Javascript
js 判断当前时间是否处于某个一个时间段内
Sep 19 Javascript
JavaScript Event学习第十一章 按键的检测
Feb 10 #Javascript
JavaScript Event学习第十章 一些可替换的事件对
Feb 10 #Javascript
jQuery插件 tabBox实现代码
Feb 09 #Javascript
基于Jquery的简单&amp;简陋Tabs插件代码
Feb 09 #Javascript
JQUERY操作JSON实例代码
Feb 09 #Javascript
JQuery 获得绝对,相对位置的坐标方法
Feb 09 #Javascript
ExtJs 3.1 XmlTreeLoader Example Error
Feb 09 #Javascript
You might like
法压式咖啡之制作法
2021/03/03 冲泡冲煮
php反弹shell实现代码
2009/04/22 PHP
php设计模式 Facade(外观模式)
2011/06/26 PHP
php安全开发 添加随机字符串验证,防止伪造跨站请求
2013/02/14 PHP
PHP生成迅雷、快车、旋风等软件的下载链接代码实例
2014/05/12 PHP
php调用KyotoTycoon简单实例
2015/04/02 PHP
Twig模板引擎用法入门教程
2016/01/20 PHP
php实现博客,论坛图片防盗链的方法
2016/10/15 PHP
php 运算符与表达式详细介绍
2016/11/30 PHP
phpstorm 配置xdebug的示例代码
2019/03/31 PHP
Laravel 模型使用软删除-左连接查询-表起别名示例
2019/10/24 PHP
laravel接管Dingo-api和默认的错误处理方式
2019/10/25 PHP
[原创]网络复制内容时常用的正则+editplus
2006/11/30 Javascript
JavaScript版TAB选项卡效果实例
2013/08/16 Javascript
JS组件Bootstrap Select2使用方法详解
2020/04/17 Javascript
Three.js学习之文字形状及自定义形状
2016/08/01 Javascript
微信小程序商城项目之淘宝分类入口(2)
2017/04/17 Javascript
图片懒加载imgLazyLoading.js使用详解
2020/09/15 Javascript
jQuery 实现左右两侧菜单添加、移除功能
2018/01/02 jQuery
通过JQuery,JQueryUI和Jsplumb实现拖拽模块
2019/06/18 jQuery
JS实现百度搜索框关键字推荐
2020/02/17 Javascript
js获取图片的base64编码并压缩
2020/12/05 Javascript
vue浏览器返回监听的具体步骤
2021/02/03 Vue.js
python操作gmail实例
2015/01/14 Python
Python3.2中的字符串函数学习总结
2015/04/23 Python
Python环境搭建之OpenCV的步骤方法
2017/10/20 Python
pip matplotlib报错equired packages can not be built解决
2018/01/06 Python
matplotlib subplots 设置总图的标题方法
2018/05/25 Python
python地震数据可视化详解
2019/06/18 Python
python2和python3哪个使用率高
2020/06/23 Python
英语专业学生的自我评价
2013/12/30 职场文书
2014年两会学习心得体会
2014/03/10 职场文书
安全生产协议书
2016/03/22 职场文书
遇事可以测出您的见识与格局
2019/09/16 职场文书
Android开发之WECHAT微信小程序路由跳转的两种形式
2022/04/12 Java/Android
ubuntu端向日葵键盘输入卡顿问题及解决
2022/12/24 Servers