一段实现页面上的图片延时加载的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 相关文章推荐
js报错 Object doesn't support this property or method的原因分析
Mar 31 Javascript
基于JQuery的模拟苹果桌面Dock效果(稳定版)
Oct 15 Javascript
javascript eval(func())使用示例
Dec 05 Javascript
js判断当前浏览器类型,判断IE浏览器方法
Jun 02 Javascript
javascript获取隐藏元素(display:none)的高度和宽度的方法
Jun 06 Javascript
javascript定时器完整实例
Feb 10 Javascript
详解JavaScript编程中正则表达式的使用
Oct 25 Javascript
JS组件Form表单验证神器BootstrapValidator
Jan 26 Javascript
requireJS使用指南
Apr 27 Javascript
微信小程序之GET请求的实例详解
Sep 29 Javascript
Vue源码解析之数据响应系统的使用
Apr 24 Javascript
vue 实现滚动到底部翻页效果(pc端)
Jul 31 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
基于Zend的Config机制的应用分析
2013/05/02 PHP
php将mysql数据库整库导出生成sql文件的具体实现
2014/01/08 PHP
Smarty使用自定义资源的方法
2015/08/08 PHP
PHP使用GD库输出汉字的方法【测试可用】
2016/11/10 PHP
php实现的redis缓存类定义与使用方法示例
2017/08/09 PHP
在Javascript中定义对象类别
2006/12/22 Javascript
js 手机号码合法性验证代码集合
2012/09/29 Javascript
Javascript操作URL函数修改版
2013/11/07 Javascript
javascript中验证大写字母、数字和中文
2014/01/15 Javascript
javascript类型转换使用方法
2014/02/08 Javascript
用js通过url传参把数据从一个页面传到另一个页面
2014/09/01 Javascript
JS小游戏之宇宙战机源码详解
2014/09/25 Javascript
js获得当前系统日期时间的方法
2015/05/06 Javascript
jQuery实现可高亮显示的二级CSS菜单效果
2015/09/01 Javascript
jQuery+CSS3实现3D立方体旋转效果
2015/11/10 Javascript
JavaScript中利用jQuery绑定事件的几种方式小结
2016/03/06 Javascript
第五章之BootStrap 栅格系统
2016/04/25 Javascript
bootstrap实现图片自动轮播
2016/12/21 Javascript
一个例子轻松学会Vue.js
2017/01/02 Javascript
Bootstrap警告(Alerts)的实现方法
2017/03/22 Javascript
ES6深入理解之“let”能替代”var“吗?
2017/06/28 Javascript
[01:15:44]首部DOTA2纪录片今日23时全网上映
2014/03/19 DOTA
python实现的一只从百度开始不断搜索的小爬虫
2013/08/13 Python
Python绘制3D图形
2018/05/03 Python
在python中bool函数的取值方法
2018/11/01 Python
Django打印出在数据库中执行的语句问题
2019/07/25 Python
Python 下载及安装详细步骤
2019/11/04 Python
使用css3背景渐变中的透明度来设置不同颜色的背景渐变
2014/03/31 HTML / CSS
财务部副经理岗位职责
2014/03/14 职场文书
数控技校生自我鉴定
2014/04/19 职场文书
工程承包协议书范本
2014/09/29 职场文书
师德先进个人材料
2014/12/20 职场文书
如何用PHP实现多线程编程
2021/05/26 PHP
十大最强火系宝可梦,喷火龙上榜,第一名有双火属性
2022/03/18 日漫
《LOL》“克隆大作战”久违归来 幻灵战队皮肤上线
2022/04/03 其他游戏
Mybatis 一级缓存和二级缓存原理区别
2022/09/23 Java/Android