纯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模拟JQuery的show与hide动画函数代码
Sep 20 Javascript
通过上下左右键和回车键切换光标实现代码
Mar 08 Javascript
js 页面元素的几个用法总结
Nov 18 Javascript
JS获取DropDownList的value值与text值的示例代码
Jan 07 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
Aug 05 Javascript
判断js的Array和Object的实现方法
Aug 29 Javascript
js 获取元素所有兄弟节点的实现方法
Sep 06 Javascript
JQuery异步提交表单与文件上传功能示例
Jan 12 Javascript
Angular客户端请求Rest服务跨域问题的解决方法
Sep 19 Javascript
JavaScript定义及输出螺旋矩阵的方法详解
Dec 01 Javascript
JavaScript实现的九种排序算法
Mar 04 Javascript
Vue 使用计时器实现跑马灯效果的实例代码
Jul 11 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设计模式 Factory(工厂模式)
2011/06/26 PHP
分享一下贝贝成长进度的php代码
2012/09/14 PHP
php过滤XSS攻击的函数
2013/11/12 PHP
PHP中替换键名的简易方法示例详解
2014/01/07 PHP
PHP从FLV文件获取视频预览图的方法
2015/03/12 PHP
php封装好的人民币数值转中文大写类
2015/12/20 PHP
PHP实现的oracle分页函数实例
2016/01/25 PHP
php求斐波那契数的两种实现方式【递归与递推】
2019/09/09 PHP
JavaScript中关于indexOf的使用方法与问题小结
2010/08/05 Javascript
Javascript类库的顶层对象名用户体验分析
2010/10/24 Javascript
JavaScript XML和string相互转化实现代码
2011/07/04 Javascript
js 获取(接收)地址栏参数值的方法
2013/04/01 Javascript
jQuery实现弹出窗口中切换登录与注册表单
2015/06/05 Javascript
Javascript中判断对象是否为空
2015/06/10 Javascript
jQuery实现广告条滚动效果
2017/08/22 jQuery
Vue导出页面为PDF格式的实现思路
2018/07/31 Javascript
JS闭包原理与应用经典示例
2018/12/20 Javascript
JS中的算法与数据结构之二叉查找树(Binary Sort Tree)实例详解
2019/08/16 Javascript
Vue-Cli项目优化操作的实现
2019/10/27 Javascript
Vue绑定用户接口实现代码示例
2020/11/04 Javascript
elementui实现预览图片组件二次封装
2020/12/29 Javascript
Vite和Vue CLI的优劣
2021/01/30 Vue.js
python itchat实现微信好友头像拼接图的示例代码
2017/08/14 Python
windows下pycharm安装、创建文件、配置默认模板
2018/07/31 Python
详解用Python实现自动化监控远程服务器
2019/05/18 Python
Python应用实现双指数函数及拟合代码实例
2020/06/19 Python
巧用CSS3的calc()宽度计算做响应模式布局的方法
2018/03/22 HTML / CSS
应届毕业生应聘自荐信
2013/12/07 职场文书
《黄河颂》教学反思
2014/02/07 职场文书
2014基层党员干部学习全国两会心得体会
2014/03/17 职场文书
高考寄语大全
2014/04/08 职场文书
2014年管理工作总结
2014/11/22 职场文书
实习护士自荐信
2015/03/25 职场文书
导游词之介休绵山
2019/12/31 职场文书
MySQL创建索引需要了解的
2021/04/08 MySQL
HTML5页面音频自动播放的实现方式
2021/06/21 HTML / CSS