纯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 相关文章推荐
再谈javascript 动态添加样式规则 W3C校检
Dec 25 Javascript
将字符串中由空格隔开的每个单词首字母大写
Apr 06 Javascript
使用phantomjs进行网页抓取的实现代码
Sep 29 Javascript
Javascript 读取操作Sql中的Xml字段
Oct 09 Javascript
用svg制作富有动态的tooltip
Jul 17 Javascript
跟我学习javascript的定时器
Nov 19 Javascript
angular.js分页代码的实例
Jul 27 Javascript
KnockoutJS 3.X API 第四章之数据控制流with绑定
Oct 10 Javascript
js实现旋转木马效果
Mar 17 Javascript
老生常谈js中的MVC
Jul 25 Javascript
jQuery分组选择器简单用法示例
Apr 04 jQuery
微信小程序接入腾讯云验证码的方法步骤
Jan 07 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对字符串的递增运算分析
2010/08/08 PHP
利用PHP扩展vld查看PHP opcode操作步骤
2013/03/04 PHP
解析php中如何直接执行SHELL
2013/06/28 PHP
PHP数据库万能引擎类adodb配置使用以及实例集锦
2014/06/12 PHP
学习php设计模式 php实现门面模式(Facade)
2015/12/07 PHP
PHP中常用的魔术方法
2017/04/28 PHP
clientX,pageX,offsetX,x,layerX,screenX,offsetLeft区别分析
2010/03/12 Javascript
Javascript中3种实现继承的方法和代码实例
2014/08/12 Javascript
5个JavaScript经典面试题
2014/10/13 Javascript
JavaScript取得WEB安全颜色列表的方法
2015/07/14 Javascript
javascript获取当前的时间戳的方法汇总
2015/07/26 Javascript
详解使用vue脚手架工具搭建vue-webpack项目
2017/05/10 Javascript
深入理解nodejs中Express的中间件
2017/05/19 NodeJs
详解vue中computed 和 watch的异同
2017/06/30 Javascript
js学习总结之dom2级事件基础知识详解
2017/07/27 Javascript
vue 不使用select实现下拉框功能(推荐)
2018/05/17 Javascript
VueJS 组件参数名命名与组件属性转化问题
2018/12/03 Javascript
layer弹出层显示在top顶层的方法
2019/09/11 Javascript
layui 图片上传+表单提交+ Spring MVC的实例
2019/09/21 Javascript
详解小程序横屏方案对比
2020/06/28 Javascript
Python list操作用法总结
2015/11/10 Python
Django 导出 Excel 代码的实例详解
2017/08/11 Python
解决安装pyqt5之后无法打开spyder的问题
2019/12/13 Python
Python 自由定制表格的实现示例
2020/03/20 Python
PythonPC客户端自动化实现原理(pywinauto)
2020/05/28 Python
Pycharm在指定目录下生成文件和删除文件的实现
2020/12/28 Python
HTML5中div、article、section的区别及使用介绍
2013/08/14 HTML / CSS
印度婴儿用品在线商店:Firstcry.com
2016/12/05 全球购物
科研先进个人典型材料
2014/01/31 职场文书
学校课外活动总结
2014/05/08 职场文书
2014党的群众路线教育实践活动总结报告
2014/10/31 职场文书
二手车交易协议书标准版
2014/11/16 职场文书
2014年高数考试作弊检讨书
2014/12/14 职场文书
Python 中的Sympy详细使用
2021/08/07 Python
JavaScript原型链详解
2021/11/07 Javascript
Python时间操作之pytz模块使用详解
2022/06/14 Python