一段实现页面上的图片延时加载的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 相关文章推荐
浅析jquery某一元素重复绑定的问题
Jan 03 Javascript
Node.js与PHP、Python的字符处理性能对比
Jul 06 Javascript
js中iframe调用父页面的方法
Oct 30 Javascript
JavaScript中的Web worker多线程API研究
Dec 06 Javascript
分享自己用JS做的扫雷小游戏
Feb 17 Javascript
JS正则表达式验证中文字符
May 08 Javascript
JS自定义滚动条效果简单实现代码
Oct 27 Javascript
JS实现获取毫秒值及转换成年月日时分秒的方法
Aug 15 Javascript
Koa代理Http请求的示例代码
Oct 10 Javascript
Vue中图片Src使用变量的方法
Oct 30 Javascript
javascript实现倒计时效果
Feb 17 Javascript
jQuery实现鼠标放置名字上显示详细内容气泡提示框效果的方法分析
Apr 04 jQuery
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
php使用curl伪造浏览器访问操作示例
2019/09/30 PHP
javascript 程序库的比较(一)之DOM功能
2010/04/07 Javascript
JQuery实现表格中相同单元格合并示例代码
2013/06/26 Javascript
javascript根据像素点取位置示例
2014/01/27 Javascript
学习JavaScript设计模式(封装)
2015/11/26 Javascript
JavaScript动态添加事件之事件委托
2016/07/12 Javascript
基于jQuery实现的幻灯图片切换
2016/12/02 Javascript
Vue.js列表渲染绑定jQuery插件的正确姿势
2017/06/29 jQuery
JavaScript复制内容到剪贴板的两种常用方法
2018/02/27 Javascript
js实现延迟加载的几种方法详解
2019/01/19 Javascript
vue.js中ref和$refs的使用及示例讲解
2019/08/14 Javascript
解决layui富文本编辑器图片上传无法回显的问题
2019/09/18 Javascript
vue多个元素的样式选择器问题
2019/11/29 Javascript
[02:56]《DAC最前线》之国外战队抵达上海备战亚洲邀请赛
2015/01/28 DOTA
解读Python中degrees()方法的使用
2015/05/18 Python
基于Python实现通过微信搜索功能查看谁把你删除了
2016/01/27 Python
Python搭建HTTP服务器和FTP服务器
2017/03/09 Python
python实现微信自动回复功能
2018/04/11 Python
Python实现端口检测的方法
2018/07/24 Python
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
2018/08/01 Python
python生成lmdb格式的文件实例
2018/11/08 Python
python定时按日期备份MySQL数据并压缩
2019/04/19 Python
python实现知乎高颜值图片爬取
2019/08/12 Python
详解Django3中直接添加Websockets方式
2020/02/12 Python
最好的意大利皮夹克:D’Arienzo
2018/12/04 全球购物
威尔逊皮革:Wilsons Leather
2018/12/07 全球购物
德国家用电器购物网站:Premiumshop24
2019/08/22 全球购物
人力资源管理专业毕业生自我评价
2013/09/21 职场文书
自荐信要包含哪些内容
2013/11/06 职场文书
高一数学教学反思
2014/02/07 职场文书
《在家里》教后反思
2014/03/01 职场文书
幼儿教师师德师风演讲稿
2014/08/22 职场文书
英语四级考试作弊检讨书
2014/09/29 职场文书
2014年财务工作总结与计划
2014/12/08 职场文书
2015年幼儿园班务工作总结
2015/05/12 职场文书
竞选稿之小学班干部
2019/10/31 职场文书