纯javascript实现图片延时加载方法


Posted in Javascript onAugust 21, 2015

最近开始整理一些以前写的好用的插件,…^-^!!!

随着页面信息越来越丰富饱满,尤其像淘宝,京东之类的购物网站,首页就是他们的生命线,- -||||

最近在做某银行的网站,只有挤上首页才能得到更多的关注,于是乎各种业务人员就开始了首页位置之争,为了平息他们的战乱。体现我大度包容的一面 ,啊哈哈哈

首页囊括了他们全部的需求,他们满意的走人了,结果技术经理来了,说首页加载怎么这么大,于是乎,减!!!

首当其冲,缩小图片K数,不够,那怎么办,好吧,进入正题。长页面未显示的部分可以先不加载,省流量就是省钱,开搞!!!

思路就是,判断图片在页面中的位置,如果图片的位置大于小于当前的屏幕高度,那么显示图片,否则隐藏图片。

怎么一开始隐藏图片呢,很简单,<img csii_src="1.png">,给一个浏览器不认识的属性csii_src,当需要显示图片的时候在element.src=element.getAttribute("csii_src");,思路很简单吧,上代码了。

function lazyLoad() {
var map_element = {};
var element_obj = [];
var download_count = 0;
var last_offset = -1;
var doc_body = null;
var doc_element = null;
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() {
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("csii_src")) {
element_obj.push(el[j]);
}
}
}

for ( var i = 0, len = element_obj.length; i < len; i++) {
var o_img = element_obj[i];
var t_index = getAbsoluteTop(o_img);
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;*/
var offset;
if(os.firefox){
offset = doc_element.scrollTop;
}else{
offset = doc_body.scrollTop;
}

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 + 20;
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("csii_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();
$(window).scroll(function(){
initDownloadListen();
});
}
;
init();
}

不足之处,页面结构必须已定好,图片的高度必须设置好,不然,无法计算图片距离顶部的高度。需注意。

我们再来看下另外一个小伙伴是如何实现的

<!-- 
      var temp = -1;//用来判断是否是向下滚动(向上滚动就不需要判断延迟加载图片了) 
       
      window.onscroll = function() { 
      var imgElements = document.getElementsByTagName("img"); 
      var lazyImgArr = new Array(); 
      var j = 0; 
      for(var i=0; i<imgElements.length; i++) { 
       if(imgElements[i].className == "lazy"){ 
        lazyImgArr[j++] = imgElements[i]; 
       } 
      } 
     
              var scrollHeight = document.body.scrollTop;//滚动的高度 
      var bodyHeight = document.body.offsetHeight;//body(页面)可见区域的总高度 
      if(temp < scrollHeight) {//为true表示是向下滚动,否则是向上滚动,不需要执行动作。 
       
       for(var k=0; k<lazyImgArr.length; k++) { 
       var imgTop = lazyImgArr[k].offsetTop;//1305(图片纵坐标) 
       if((imgTop - scrollHeight) <= bodyHeight) { 
        lazyImgArr[k].src = lazyImgArr[k].alt; 
        lazyImgArr[k].className = "notlazy" 
               } 
      } 
       
      temp = scrollHeight; 
     } 
       
    }; 
       
// -->

思路如下:先在<img>标签中将src的值设置为一个极小的图片文件路径,alt属性的值设置为真正要显示的图片文件路径,当向下滚动到图片的位置时,将src的值替换为alt的值,这样就会自动加载真正要显示的图片了,同时,给标签设置一个值为lazy的class,加载完了之后,将其值设置为notlazy,以此来判断哪些图片需要加载,哪些不需要。

代码中的注释已经很清楚了,各位自己慢慢看吧。欢迎扔砖,更欢迎各种改进和完善的建议。

Javascript 相关文章推荐
js 对象是否存在判断
Jul 15 Javascript
基于jquery的高性能td和input切换并可修改内容实现代码
Jan 09 Javascript
GRID拖拽行的实例代码
Jul 18 Javascript
点击进行复制的JS代码实例
Aug 23 Javascript
详解小程序开发经验:多页面数据同步
May 18 Javascript
VUE实现移动端列表筛选功能
Aug 23 Javascript
vue使用codemirror的两种用法
Aug 27 Javascript
vue.js购物车添加商品组件的方法
Sep 17 Javascript
解决layui数据表格Date日期格式的回显Object的问题
Sep 19 Javascript
vue计算属性无法监听到数组内部变化的解决方案
Nov 06 Javascript
Angular如何由模板生成DOM树的方法
Dec 23 Javascript
详解ES6数组方法find()、findIndex()的总结
May 12 Javascript
jQuery实现大转盘抽奖活动仿QQ音乐代码分享
Aug 21 #Javascript
js变形金刚文字特效代码分享
Aug 20 #Javascript
js限制文本框的输入内容代码分享(3类)
Aug 20 #Javascript
JS实现的通用表单验证插件完整实例
Aug 20 #Javascript
jquery Easyui快速开发总结
Aug 20 #Javascript
纯jquery实现模仿淘宝购物车结算
Aug 20 #Javascript
js实现按钮颜色渐变动画效果
Aug 20 #Javascript
You might like
Email+URL的判断和自动转换函数
2006/10/09 PHP
php mysql Errcode: 28 终极解决方法
2009/07/01 PHP
javascript脚本调试方法小结
2008/11/24 Javascript
IE与Firefox在JavaScript上的7个不同句法分享
2011/10/30 Javascript
script标签属性type与language使用选择
2012/12/02 Javascript
jQuery(非HTML5)可编辑表格实现代码
2012/12/11 Javascript
jQuery学习笔记(1)--用jQuery实现异步通信(用json传值)具体思路
2013/04/08 Javascript
JS动态添加与删除select中的Option对象(示例代码)
2013/12/20 Javascript
原生javascript实现addClass,removeClass,hasClass函数
2016/02/25 Javascript
详解AngularJs中$sce与$sceDelegate上下文转义服务
2016/09/21 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(二)
2017/05/11 Javascript
vue中v-for通过动态绑定class实现触发效果
2018/12/06 Javascript
React性能优化系列之减少props改变的实现方法
2019/01/17 Javascript
探索JavaScript中私有成员的相关知识
2019/06/13 Javascript
[00:32]2018DOTA2亚洲邀请赛VG出场
2018/04/03 DOTA
在Python的Django框架中用流响应生成CSV文件的教程
2015/05/02 Python
Python中进程和线程的区别详解
2017/10/29 Python
详解Python之unittest单元测试代码
2018/01/24 Python
Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例
2018/05/21 Python
Django项目中实现使用qq第三方登录功能
2019/08/13 Python
基于Django框架的权限组件rbac实例讲解
2019/08/31 Python
使用pyinstaller逆向.pyc文件
2019/12/20 Python
pytorch 实现删除tensor中的指定行列
2020/01/13 Python
python代数式括号有效性检验示例代码
2020/10/04 Python
使用CSS3制作一个简单的Chrome模拟器
2015/07/15 HTML / CSS
使用phonegap进行提示操作的具体方法
2017/03/30 HTML / CSS
师范生实习自我鉴定
2013/11/01 职场文书
厨师岗位职责
2013/11/12 职场文书
大学生个人简历自我评价
2013/11/16 职场文书
物业管理专业个人的自我评价
2013/11/19 职场文书
车贷收入证明范本
2014/01/09 职场文书
国际会议邀请函范文
2014/01/16 职场文书
党员干部公开承诺书
2014/03/26 职场文书
交警个人先进事迹材料
2014/05/11 职场文书
秋收起义观后感
2015/06/11 职场文书
pandas中对文本类型数据的处理小结
2021/11/01 Python