一段实现页面上的图片延时加载的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常用函数 不错
Sep 08 Javascript
JavaScript表单常用验证集合
Jan 16 Javascript
模拟select的代码
Oct 19 Javascript
js将long日期格式转换为标准日期格式实现思路
Apr 07 Javascript
js语法学习之判断一个对象是否为数组
May 13 Javascript
javascript学习笔记_浅谈基础语法,类型,变量
Sep 19 Javascript
详解利用jsx写vue组件的方法示例
Jul 17 Javascript
Angular异步变同步处理方法
Aug 13 Javascript
vue data引入本地图片的两种方式小结
Nov 13 Javascript
解决VUE项目localhost端口服务器拒绝连接,只能用127.0.0.1的问题
Aug 14 Javascript
解决vue-router 嵌套路由没反应的问题
Sep 22 Javascript
微信小程序实现选项卡滑动切换
Oct 22 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
一个简易需要注册的留言版程序
2006/10/09 PHP
用PHP将网址字符串转换成超链接(网址或email)
2010/05/25 PHP
PHP输入流php://input介绍
2012/09/18 PHP
PHP中array_map与array_column之间的关系分析
2014/08/19 PHP
php查询mssql出现乱码的解决方法
2014/12/29 PHP
php中file_get_contents()函数用法实例
2019/02/21 PHP
解决laravel session失效的问题
2019/10/14 PHP
javascript开发随笔一 preventDefault的必要
2011/11/25 Javascript
jQuery实现页面滚动时动态加载内容的方法
2015/03/20 Javascript
JQuery实现的图文自动轮播效果插件
2015/06/19 Javascript
Jquery检验手机号是否符合规则并根据手机号检测结果将提交按钮设为不同状态
2015/11/26 Javascript
jQuery获取某天的农历日期并判断是否除夕或新年的方法
2016/03/01 Javascript
JavaScript Promise 用法
2016/06/14 Javascript
prototype.js常用函数详解
2016/06/18 Javascript
bootstrap table 多选框分页保留示例代码
2017/03/08 Javascript
利用node.js+mongodb如何搭建一个简单登录注册的功能详解
2017/07/30 Javascript
JavaScript碎片—函数闭包(模拟面向对象)
2019/03/13 Javascript
利用es6 new.target来对模拟抽象类的方法
2019/05/10 Javascript
javascript设计模式 ? 策略模式原理与用法实例分析
2020/04/21 Javascript
javascript如何使用函数random来实现课堂随机点名方法详解
2020/07/28 Javascript
如何在Vue项目中添加接口监听遮罩
2021/01/25 Vue.js
微信小程序组件生命周期的踩坑记录
2021/03/03 Javascript
python实现文件快照加密保护的方法
2015/06/30 Python
解决matplotlib库show()方法不显示图片的问题
2018/05/24 Python
numpy向空的二维数组中添加元素的方法
2018/11/01 Python
在unittest中使用 logging 模块记录测试数据的方法
2018/11/30 Python
妙用itchat! python实现久坐提醒功能
2019/11/25 Python
python3将变量写入SQL语句的实现方式
2020/03/02 Python
pycharm中import呈现灰色原因的解决方法
2020/03/04 Python
python 实现图像快速替换某种颜色
2020/06/04 Python
墨西哥购物网站:Elektra
2020/01/21 全球购物
Orlebar Brown官网:设计师泳裤和泳装
2020/12/08 全球购物
《果园机器人》教学反思
2014/04/13 职场文书
幼儿园植树节活动总结
2014/07/04 职场文书
领导干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
数学备课组工作总结
2015/08/12 职场文书