一段实现页面上的图片延时加载的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中的call实现继承
Jan 22 Javascript
javascript之学会吝啬 精简代码
Apr 25 Javascript
使用js 设置url参数
Jul 08 Javascript
jquery实现不同大小浏览器使用不同的css样式表的方法
Apr 02 Javascript
jquery读取xml文件实现省市县三级联动的方法
May 29 Javascript
JavaScript中的this关键字使用详解
Aug 14 Javascript
Bootstrap中CSS的使用方法
Feb 17 Javascript
JS原型链 详解及示例代码
Sep 06 Javascript
angular动态删除ng-repaeat添加的dom节点的方法
Jul 20 Javascript
前端主流框架vue学习笔记第二篇
Jul 26 Javascript
jQuery+Cookie实现切换皮肤功能【附源码下载】
Mar 25 jQuery
仿iPhone通讯录制作小程序自定义选择组件的实现
May 23 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
一个SQL管理员的web接口
2006/10/09 PHP
php正则过滤html标签、空格、换行符的代码(附说明)
2010/10/25 PHP
php获取汉字首字母的函数
2013/11/07 PHP
destoon二次开发模板及调用语法汇总
2014/06/21 PHP
php获取一定范围内取N个不重复的随机数
2016/05/28 PHP
smarty循环嵌套用法示例分析
2016/07/19 PHP
Python中使用django form表单验证的方法
2017/01/16 PHP
Zend Framework框架中实现Ajax的方法示例
2017/06/27 PHP
php和js实现根据子网掩码和ip计算子网功能示例
2019/11/09 PHP
JS将光标聚焦在文本最后的实现代码
2014/03/28 Javascript
jQuery中DOM树操作之复制元素的方法
2015/01/23 Javascript
javascript实现验证IP地址等相关信息代码
2015/05/10 Javascript
jquery实现简单的表单验证
2015/11/17 Javascript
谈谈jQuery之Deferred源码剖析
2016/12/19 Javascript
基于zTree树形菜单的使用实例
2017/12/25 Javascript
Vue 中mixin 的用法详解
2018/04/23 Javascript
node.js读取Excel数据(下载图片)的方法示例
2018/08/02 Javascript
node链接mongodb数据库的方法详解【阿里云服务器环境ubuntu】
2019/03/07 Javascript
node.js基于dgram数据报模块创建UDP服务器和客户端操作示例
2020/02/12 Javascript
在pycharm中开发vue的方法步骤
2020/03/04 Javascript
js禁止查看源文件屏蔽Ctrl+u/s、F12、右键等兼容IE火狐chrome
2020/10/01 Javascript
centos系统升级python 2.7.3
2014/07/03 Python
python使用socket进行简单网络连接的方法
2015/04/29 Python
python merge、concat合并数据集的实例讲解
2018/04/12 Python
基于python绘制科赫雪花
2018/06/22 Python
Python实现多属性排序的方法
2018/12/05 Python
python3 cvs将数据读取为字典的方法
2018/12/22 Python
python 的 scapy库,实现网卡收发包的例子
2019/07/23 Python
Pytest参数化parametrize使用代码实例
2020/02/22 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧装饰器信号与槽详细使用方法与实例
2020/03/06 Python
python实现提取COCO,VOC数据集中特定的类
2020/03/10 Python
Python-jenkins 获取job构建信息方式
2020/05/12 Python
简单说下OSPF的操作过程
2014/08/13 面试题
高中历史教学反思
2016/02/19 职场文书
创业计划书之青年旅馆
2019/09/23 职场文书
Win10/Win11 任务栏替换成经典样式
2022/04/19 数码科技