一段实现页面上的图片延时加载的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实现可输入搜索文字的下拉框
Oct 23 Javascript
调用innerHTML之后onclick失效问题的解决方法
Jan 28 Javascript
javascript基于HTML5 canvas制作画箭头组件
Jun 25 Javascript
JS定义网页表单提交(submit)的方法
Mar 20 Javascript
jQuery的实例及必知重要的jQuery选择器详解
May 20 Javascript
js实现复选框的全选和取消全选效果
Jan 03 Javascript
Ajax基础知识详解
Feb 17 Javascript
详解axios在node.js中的post使用
Apr 27 Javascript
react路由配置方式详解
Aug 07 Javascript
JS+HTML5实现获取手机验证码倒计时按钮
Aug 08 Javascript
element ui table(表格)实现点击一行展开功能
Dec 04 Javascript
解决三元运算符 报错“SyntaxError: can''t assign to conditional expression”
Feb 12 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
php xml文件操作实现代码(二)
2009/03/20 PHP
PHP写的获取各搜索蜘蛛爬行记录代码
2012/08/21 PHP
php获取本机真实IP地址实例代码
2016/03/31 PHP
php使用ffmpeg向视频中添加文字字幕的实现方法
2016/05/23 PHP
PHP 闭包详解及实例代码
2016/09/28 PHP
在textarea中屏蔽js的某个function的javascript代码
2007/04/20 Javascript
10款非常有用的 Ajax 插件分享
2012/03/14 Javascript
js 动态加载事件的几种方法总结
2013/12/25 Javascript
js中取得变量绝对值的方法
2015/01/03 Javascript
js获取滚动距离的方法
2015/05/30 Javascript
javascript框架设计之框架分类及主要功能
2015/06/23 Javascript
javascript封装简单实现方法
2015/08/11 Javascript
jquery实现的V字形显示效果代码
2015/10/27 Javascript
深入浅析JavaScript系列(13):This? Yes,this!
2016/01/05 Javascript
深入浅析knockout源码分析之订阅
2016/07/12 Javascript
基于JavaScript Array数组方法(新手必看篇)
2016/08/20 Javascript
HTML中setCapture、releaseCapture 使用方法浅析
2016/09/25 Javascript
微信小程序 Video API实例详解
2016/10/02 Javascript
Jquery Easyui对话框组件Dialog使用详解(14)
2016/12/19 Javascript
Express之get,pos请求参数的获取
2017/05/02 Javascript
JS中的BOM应用
2018/02/02 Javascript
JavaScript创建对象方法实例小结
2018/09/03 Javascript
使用Python的判断语句模拟三目运算
2015/04/24 Python
Python操作SQLite数据库的方法详解
2017/06/16 Python
Python+OpenCV感兴趣区域ROI提取方法
2019/01/10 Python
python实现批量nii文件转换为png图像
2019/07/18 Python
python 引用传递和值传递详解(实参,形参)
2020/06/05 Python
pytorch  网络参数 weight bias 初始化详解
2020/06/24 Python
canvas小画板之平滑曲线的实现
2020/08/12 HTML / CSS
巴西购物网站:Submarino
2020/01/19 全球购物
俄罗斯最大的灯具网站:Fandeco
2020/03/14 全球购物
接口可以包含哪些成员
2012/09/30 面试题
大学毕业生推荐信
2014/07/09 职场文书
高中班主任评语
2014/12/30 职场文书
2015年底工作总结范文
2015/05/15 职场文书
地雷战观后感
2015/06/09 职场文书