一段实现页面上的图片延时加载的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 相关文章推荐
ExtJS下grid的一些属性说明
Dec 13 Javascript
JavaScript表达式:URL 协议介绍
Mar 10 Javascript
jquery无缝向上滚动实现代码
Mar 29 Javascript
jQuery Real Person验证码插件防止表单自动提交
Nov 06 Javascript
AngularJS基础 ng-cloak 指令简单示例
Aug 01 Javascript
JQuery获取鼠标进入和离开容器的方向
Dec 29 Javascript
基于JavaScript实现前端数据多条件筛选功能
Aug 19 Javascript
微信小程序收货地址API兼容低版本解决方法
May 18 Javascript
使用layui实现的左侧菜单栏以及动态操作tab项方法
Sep 10 Javascript
vue中上传视频或图片或图片和文字一起到后端的解决方法
Dec 01 Javascript
Vue 实现拨打电话操作
Nov 16 Javascript
Ajax是什么?Ajax高级用法之Axios技术
Apr 21 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
人工智能开始玩《星际争霸2》 你的操作跟得上吗?
2017/08/11 星际争霸
提取HTML标签
2006/10/09 PHP
jQuery+php简单实现全选删除的方法
2016/11/28 PHP
js arguments.callee的应用代码
2009/05/07 Javascript
js自定义事件及事件交互原理概述(一)
2013/02/01 Javascript
有关javascript的性能优化 (repaint和reflow)
2013/04/12 Javascript
JS实现新浪博客左侧的Blog管理菜单效果代码
2015/10/22 Javascript
js阻止浏览器默认行为触发的通用方法(推荐)
2016/05/15 Javascript
JS不用正则验证输入的字符串是否为空(包含空格)的实现代码
2016/06/14 Javascript
vue实现可增删查改的成绩单
2016/10/27 Javascript
脚本div实现拖放功能(两种)
2017/02/13 Javascript
jQuery简易时光轴实现方法示例
2017/03/13 Javascript
js遍历获取表格内数据的方法(必看)
2017/04/06 Javascript
bootstrap table服务端实现分页效果
2017/08/10 Javascript
微信小程序实现左滑修改、删除功能
2020/10/19 Javascript
微信小程序页面缩放式侧滑效果的实现代码
2018/11/15 Javascript
vue实现扫码功能
2020/01/17 Javascript
[01:19:35]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第二局
2016/03/05 DOTA
[37:50]VP vs TNC Supermajor小组赛B组 BO3 第一场 6.2
2018/06/03 DOTA
Python线程指南详细介绍
2017/01/05 Python
python实现k-means聚类算法
2018/02/23 Python
Win7 64位下python3.6.5安装配置图文教程
2020/10/27 Python
Python分析彩票记录并预测中奖号码过程详解
2019/07/09 Python
Python运算符+与+=的方法实例
2021/02/18 Python
运动会广播稿500字
2014/01/28 职场文书
农贸市场管理制度
2014/01/31 职场文书
中职生自荐信范文
2014/06/15 职场文书
伦敦奥运会的口号
2014/06/21 职场文书
学生检讨书怎么写
2014/10/09 职场文书
同意转租证明
2015/06/24 职场文书
CSS3实现的文字弹出特效
2021/04/16 HTML / CSS
JS Object构造函数之Object.freeze
2021/04/28 Javascript
vue @click.native 绑定原生点击事件
2022/04/22 Vue.js
PHP RabbitMQ消息列队
2022/05/11 PHP
CSS子盒子水平和垂直居中的五种方法
2022/07/23 HTML / CSS
table设置超出部分隐藏,鼠标移上去显示全部内容的方法
2022/12/24 HTML / CSS