一段实现页面上的图片延时加载的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 StringBuilder类实现
Dec 22 Javascript
js的2种继承方式详解
Mar 04 Javascript
js Dialog 去掉右上角的X关闭功能
Apr 23 Javascript
node.js中的fs.exists方法使用说明
Dec 17 Javascript
js实现键盘上下左右键选择文字并显示在文本框的方法
May 07 Javascript
Angularjs 自定义服务的三种方式(推荐)
Aug 02 Javascript
vue.js从安装到搭建过程详解
Mar 17 Javascript
详解vue项目构建与实战
Jun 27 Javascript
浅谈React + Webpack 构建打包优化
Jan 23 Javascript
基于axios 解决跨域cookie丢失的问题
Sep 26 Javascript
Angular8引入百度Echarts进行图表分析的实现代码
Nov 27 Javascript
小程序自动化测试的示例代码
Aug 11 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 eval函数用法 PHP中eval()函数小技巧
2012/10/31 PHP
PHP5.3安装Zend Guard Loader图文教程
2014/09/29 PHP
php删除文本文件中重复行的方法
2015/04/28 PHP
10条php编程小技巧
2015/07/07 PHP
PHP在线打包下载功能示例
2016/10/15 PHP
php 变量引用与变量销毁机制详细介绍
2016/12/05 PHP
php脚本守护进程原理与实现方法详解
2017/07/20 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
PHP Ajax跨域问题解决方案代码实例
2020/08/01 PHP
js getBoundingClientRect() 来获取页面元素的位置
2010/11/25 Javascript
node.js 一个简单的页面输出实现代码
2012/03/07 Javascript
javascript针对DOM的应用分析(四)
2012/04/15 Javascript
详解JavaScript语法对{}处理的坑爹之处
2014/06/05 Javascript
如何在MVC应用程序中使用Jquery
2014/11/17 Javascript
浅析javascript中的DOM
2015/03/01 Javascript
JavaScript修改作用域外变量的方法
2016/03/25 Javascript
数组Array的排序sort方法
2017/02/17 Javascript
移动端效果之IndexList详解
2017/10/20 Javascript
对Vue- 动态元素属性及v-bind和v-model的区别详解
2018/08/27 Javascript
详解关于微信setData回调函数中的坑
2019/02/18 Javascript
详解基于iview-ui的导航栏路径(面包屑)配置
2019/02/22 Javascript
微信小程序常用赋值方法小结
2019/04/30 Javascript
laypage+SpringMVC实现后端分页
2019/07/27 Javascript
JS实现单张或多张图片持续无缝滚动的示例代码
2020/05/10 Javascript
ajax jquery实现页面某一个div的刷新效果
2021/03/04 jQuery
python求斐波那契数列示例分享
2014/02/14 Python
Python中shutil模块的学习笔记教程
2017/04/04 Python
Pytorch卷积层手动初始化权值的实例
2019/08/17 Python
德国家具、照明、家居用品网上商店:Wayfair.de
2020/02/13 全球购物
写自荐信的七个技巧
2013/10/15 职场文书
新闻专业推荐信范文
2013/11/20 职场文书
面试必备的求职信
2014/05/25 职场文书
个人整改措施落实情况汇报
2014/10/29 职场文书
房产公证书
2015/01/23 职场文书
爱的教育读书笔记
2015/06/26 职场文书
Django如何创作一个简单的最小程序
2021/05/12 Python