一段实现页面上的图片延时加载的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 相关文章推荐
实现png图片和png背景透明(支持多浏览器)的方法
Sep 08 Javascript
js下获取div中的数据的原理分析
Apr 07 Javascript
javascript克隆对象深度介绍
Nov 20 Javascript
jquery实现倒计时代码分享
Jun 13 Javascript
js兼容pc端浏览器并有多种弹出小提示的手机端浮层控件实例
Apr 29 Javascript
解决JS请求服务器gbk文件乱码的问题
Oct 16 Javascript
使用jQuery制作浮动工具栏的实例分享
May 13 Javascript
JavaScript实现的仿新浪微博原生态输入字数即时检查功能【兼容IE6】
Sep 26 Javascript
详解vue-cli脚手架build目录中的dev-server.js配置文件
Nov 24 Javascript
学习Vue组件实例
Apr 28 Javascript
vue js秒转天数小时分钟秒的实例代码
Aug 08 Javascript
vue 使用原生组件上传图片的实例
Sep 08 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代码
2010/08/08 PHP
php empty() 检查一个变量是否为空
2011/11/10 PHP
基于php设计模式中工厂模式详细介绍
2013/05/15 PHP
搭建Vim为自定义的PHP开发工具的一些技巧
2015/12/11 PHP
laravel-admin的图片删除实例
2019/09/30 PHP
jquery.artwl.thickbox.js  一个非常简单好用的jQuery弹出层插件
2012/03/01 Javascript
jquery实现table鼠标经过变色代码
2013/09/25 Javascript
深入理解JavaScript是如何实现继承的
2013/12/12 Javascript
jQuery焦点图切换简易插件制作过程全纪录
2014/08/27 Javascript
javascript实现点击按钮弹出一个可关闭层窗口同时网页背景变灰的方法
2015/05/13 Javascript
js+div实现文字滚动和图片切换效果代码
2015/08/27 Javascript
深入理解AngularJs-scope的脏检查(一)
2017/06/19 Javascript
微信小程序 input输入及动态设置按钮的实现
2017/10/27 Javascript
AJAX在JQuery中的应用详解
2019/01/30 jQuery
vue中使用v-model完成组件间的通信
2019/08/22 Javascript
js调用网络摄像头的方法
2020/12/05 Javascript
[05:16]《大圣!大圣》——DOTA2新英雄齐天大圣配音李世宏老师专访
2016/12/13 DOTA
python 从远程服务器下载日志文件的程序
2013/02/10 Python
pip install urllib2不能安装的解决方法
2018/06/12 Python
Python零基础入门学习之输入与输出
2019/04/03 Python
python解释器spython使用及原理解析
2019/08/24 Python
python将字母转化为数字实例方法
2019/10/04 Python
python 实现批量图片识别并翻译
2020/11/02 Python
python函数超时自动退出的实操方法
2020/12/28 Python
python regex库实例用法总结
2021/01/03 Python
python中remove函数的踩坑记录
2021/01/04 Python
工程部主管岗位职责
2013/11/17 职场文书
入党积极分子思想汇报范文
2014/01/05 职场文书
写给保洁员表扬信
2014/01/08 职场文书
生产部岗位职责范文
2014/02/07 职场文书
《广玉兰》教学反思
2014/04/14 职场文书
乡镇八一建军节活动方案
2014/08/24 职场文书
小学关爱留守儿童活动方案
2014/08/25 职场文书
2016年清明节红领巾广播稿
2015/12/17 职场文书
Dashboard管理Kubernetes集群与API访问配置
2022/04/01 Servers
Go gorilla securecookie库的安装使用详解
2022/08/14 Golang