纯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 相关文章推荐
Prototype 学习 工具函数学习($w,$F方法)
Jul 12 Javascript
JS实现淘宝幻灯片效果的实现方法
Mar 22 Javascript
JQuery中如何传递参数如click(),change()等具体实现
Apr 28 Javascript
js运动框架_包括图片的淡入淡出效果
May 11 Javascript
JS控制图片等比例缩放的示例代码
Dec 24 Javascript
直接在JS里创建JSON数据然后遍历使用
Jul 25 Javascript
js操作滚动条事件实例
Jan 29 Javascript
JQuery在循环中绑定事件的问题详解
Jun 02 Javascript
AngularJs Injecting Services Into Controllers详解
Sep 02 Javascript
PHP获取当前页面完整URL的方法
Dec 02 Javascript
详解通过JSON数据使用VUE.JS
May 26 Javascript
微信小程序画布圆形进度条显示效果
Nov 17 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
经典PHP加密解密函数Authcode()修复版代码
2015/04/05 PHP
php实现的美国50个州选择列表实例
2015/04/20 PHP
PHP7.1新功能之Nullable Type用法分析
2016/09/26 PHP
php微信开发之图片回复功能
2018/06/14 PHP
深入理解JavaScript系列(8) S.O.L.I.D五大原则之里氏替换原则LSP
2012/01/15 Javascript
深入理解jQuery中live与bind方法的区别
2013/12/18 Javascript
jQuery控制cookie过期时间的方法
2015/04/07 Javascript
jquery显示loading图片直到网页加载完成的方法
2015/06/25 Javascript
基于bootstrap3和jquery的分页插件
2015/07/31 Javascript
基于jQuery实现点击最后一行实现行自增效果的表格
2016/01/12 Javascript
Javascript将双字节字符转换成单字节字符并计算长度
2016/06/22 Javascript
BootStrap Progressbar 实现大文件上传的进度条的实例代码
2016/06/27 Javascript
javascript 判断是否是微信浏览器的方法
2016/10/09 Javascript
bootstrapValidator bootstrap-select验证不可用的解决办法
2017/01/11 Javascript
微信小程序 轮播图swiper详解及实例(源码下载)
2017/01/11 Javascript
jQuery 实现双击编辑表格功能
2017/06/19 jQuery
Angular实现下拉框模糊查询功能示例
2018/01/03 Javascript
JS实现生成由字母与数字组合的随机字符串功能详解
2018/05/25 Javascript
Python实现计算圆周率π的值到任意位的方法示例
2018/05/08 Python
python筛选出两个文件中重复行的方法
2018/05/31 Python
Python 3.x 判断 dict 是否包含某键值的实例讲解
2018/07/06 Python
Django框架模板注入操作示例【变量传递到模板】
2018/12/19 Python
python+opencv实现阈值分割
2018/12/26 Python
python 中xpath爬虫实例详解
2019/08/26 Python
Python 炫技操作之合并字典的七种方法
2020/04/10 Python
python如何解析复杂sql,实现数据库和表的提取的实例剖析
2020/05/15 Python
Python绘制词云图之可视化神器pyecharts的方法
2021/02/23 Python
HTML5中的websocket实现直播功能
2018/05/21 HTML / CSS
Calphalon美国官网:美国顶级锅具品牌
2020/02/05 全球购物
行政总监岗位职责
2013/12/05 职场文书
文员岗位职责范本
2014/03/08 职场文书
幼儿教师寄语集锦
2014/04/03 职场文书
过程装备与控制工程专业求职信
2014/07/02 职场文书
2014年前台个人工作总结
2014/11/14 职场文书
php TP5框架生成二维码链接
2021/04/01 PHP
Mysql数据库值的添加、修改、删除及清空操作实例
2021/06/20 MySQL