一段实现页面上的图片延时加载的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阻止事件冒泡 event.stopPropagation
Dec 11 Javascript
js如何取消事件冒泡
Sep 23 Javascript
Jquery ajax执行顺序 返回自定义错误信息(实例讲解)
Nov 06 Javascript
js实现全屏漂浮广告移入光标停止移动
Dec 02 Javascript
JS使用for循环遍历Table的所有单元格内容
Aug 21 Javascript
浅谈Jquery为元素绑定事件
Apr 27 Javascript
今天抽时间给大家整理jquery和ajax的相关知识
Nov 17 Javascript
详解angularjs结合pagination插件实现分页功能
Feb 10 Javascript
JS控制下拉列表左右选择实例代码
May 08 Javascript
three.js 将图片马赛克化的示例代码
Jul 31 Javascript
JavaScript实现图片放大预览效果
Nov 02 Javascript
ECharts transform数据转换和dataZoom在项目中使用
Dec 24 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文件
2007/01/04 PHP
php在线生成ico文件的代码
2007/10/09 PHP
ThinkPHP CURD方法之limit方法详解
2014/06/18 PHP
php 利用array_slice函数获取随机数组或前几条数据
2015/09/30 PHP
PHP的PDO操作简单示例
2016/03/30 PHP
js获取变量
2006/08/24 Javascript
jQuery 验证插件 Web前端设计模式(asp.net)
2010/10/17 Javascript
jquery 插件学习(四)
2012/08/06 Javascript
解析JavaScript中delete操作符不能删除的对象
2013/12/03 Javascript
jQuery层级选择器用法分析
2015/02/10 Javascript
prototype框架中美元符号$用法分析
2016/01/22 Javascript
AngularJS删除路由中的#符号的方法
2016/09/20 Javascript
js图片轮播手动切换特效
2017/01/12 Javascript
jQuery基于正则表达式的表单验证功能示例
2017/01/21 Javascript
vuejs2.0实现分页组件使用$emit进行事件监听数据传递的方法
2017/02/22 Javascript
JavaScript插入排序算法原理与实现方法示例
2018/08/06 Javascript
微信小程序自定义组件封装及父子间组件传值的方法
2018/08/28 Javascript
详解多页应用 Webpack4 配置优化与踩坑记录
2018/10/16 Javascript
JS基础之逻辑结构与循环操作示例
2020/01/19 Javascript
AutoJs实现刷宝短视频的思路详解
2020/05/22 Javascript
[07:03]显微镜下的DOTA2第九期——430圣堂刺客杀戮秀
2014/06/20 DOTA
Python实现的飞速中文网小说下载脚本
2015/04/23 Python
Python 3中print函数的使用方法总结
2017/08/08 Python
Python探索之pLSA实现代码
2017/10/25 Python
python实现植物大战僵尸游戏实例代码
2019/06/10 Python
Django中自定义模型管理器(Manager)及方法
2019/09/23 Python
python数据预处理方式 :数据降维
2020/02/24 Python
Python函数的迭代器与生成器的示例代码
2020/06/18 Python
英国复古服装购物网站:Collectif
2019/10/30 全球购物
怎样让char类型的东西转换成int类型
2013/12/09 面试题
财会自我鉴定范文
2013/12/27 职场文书
迎元旦广播稿
2014/02/22 职场文书
汽车技术服务与贸易专业求职信
2014/07/20 职场文书
党员自评材料范文
2014/12/17 职场文书
失职检讨书大全
2015/01/26 职场文书
python可视化分析绘制带趋势线的散点图和边缘直方图
2022/06/25 Python