javascript图片延迟加载实现方法及思路


Posted in Javascript onDecember 31, 2015

本文实例为大家介绍了如何通过javascript来延迟加载图片,分享给大家供大家参考,具体内容如下

当一个网页中含有大量图片时,如果一开始就将图片全部加载完毕,势必会引起性能和效率上的问题,用户可能会由于等待时间过久而离开。

这个时候,我们需要利用懒加载,也就是延迟加载图片的方式,来提高网站的亲和力。

一、延迟加载图片

基本思路如下:
给需要延迟加载的图片设置自定义属性比如lazy-src,存在图片源所在路径。然后将所有需要懒加载的图片放入一个数组,在window.onscroll的时候判断该数组内容是否出现在了用户视线中,如果出现了,就将自定义属性内容赋予图片的src属性。

下面我们来具体谈谈实现步骤。
首先,我们需要定义函数返回浏览器的可视区域位置:

/**
   * @description: 返回浏览器的可视区域位置
   * @return: left:左滑轮距离,top:上滑轮距离,width:可见区域宽度,height:可见区域长度
   */
   function getClient(){
    var l,t,w,h;
    l = document.documentElement.scrollLeft||document.body.scrollLeft;
    t = document.documentElement.scrollTop||document.body.scrollTop;
    w = document.documentElement.clientWidth;
    h = document.documentElement.clientHeight;
    return {left:l,top:t,width:w,height:h};
   }

然后定义函数返回待加载资源的位置:

/**
   * @description: 返回待加载资源位置
   * @params: p:需要加载的资源节点
   * @return: left:左边距离,top:上边距离,width:宽度,height:高度
   */
   function getSubClient(p){
    var l = 0, t = 0, w, h;
    w = p.offsetWidth;
    h = p.offsetHeight;
    while(p.offsetParent){
      l += p.offsetLeft;
      t += p.offsetTop;
      p = p.offsetParent;
    } 
    return {left:l,top:t,width:w,height:h};
   }

接下来定义函数,判断两个矩形区域是否相交:

/**
   * @decription: 判断两个矩阵是否相交,返回一个布尔值
   * @params: rec1,rec2:需要比较的节点矩阵
   * @return: true: 两矩阵相交
   */
   function contains(rec1,rec2){
    var lc1,lc2,tc1,tc2,w1,h1;
    lc1 = rec1.left + rec1.width/2;
    lc2 = rec2.left + rec2.width/2;
    tc1 = rec1.top + rec1.height/2;
    tc2 = rec2.top + rec2.height/2;
    w1 = (rec1.width + rec2.width)/2;
    h1 = (rec1.height + rec2.height)/2;
    return Math.abs(lc1 - lc2)<w1&&Math.abs(tc1 - tc2)<h1;
   }

最后对图片资源进行监视,如果进入用户视野则加载资源:

/**
   * @description: 资源出现在视野中再加载.将资源放入一个数组。
   */
   var arr = document.getElementsByClassName("divX");
   window.onscroll = function(){
    var prec1 = getClient();
    var prec2;
    for(var i = arr.length-1;i>=0;i--){
      if(arr[i]){
        prec2 = getSubClient(arr[i]);
        if(contains(prec1,prec2)){
          //加载资源
          console.log(arr[i].id);
          arr[i].childNodes[0].src = arr[i].childNodes[0].getAttribute("lazy_src");
          delete arr[i];
        }
      }
    }
   }

当然,这里只是讲思路,如果用到工程上,还是有很多缺陷,比如性能和兼容性等。所以推荐一款jquery插件:lazyload

1、判断css加载完成

这里顺便说一下如何判断一个web页面的css文件加载完成。我们知道css通过外部文件引入,其实是一个link节点。所以我们只需要通过轮询来判断该link节点的sheet属性或者sheet.cssRules属性,就可以判断该css文件是否完全加载成功。

2、判断图片加载完成

同样的,img标签有一个complete属性,我们只需要通过轮询来查看该属性即可。

function imgLoad(img, callback) {
      var timer = setInterval(function() {
        if (img.complete) {
          callback(img)
          clearInterval(timer)
        }
      }, 50)
    }
    imgLoad(img1, function() {
      p1.innerHTML('加载完毕')
    })

3、判断javascript加载完成

那么如何判断javascript加载完成呢?script节点的onload方法就是加载完成后执行的。ie6和ie7则可通过readyState来判断:

function include_js(file) {
  var _doc = document.getElementsByTagName('head')[0];
  var js = document.createElement('script');
  js.setAttribute('type', 'text/javascript');
  js.setAttribute('src', file);
  _doc.appendChild(js);
  if (!/*@cc_on!@*/0) { //if not IE
    //Firefox2、Firefox3、Safari3.1+、Opera9.6+ support js.onload
    js.onload = function () {
      alert('Firefox2、Firefox3、Safari3.1+、Opera9.6+ support js.onload');
    }
  } else {
    //IE6、IE7 support js.onreadystatechange
    js.onreadystatechange = function () {
      if (js.readyState == 'loaded' || js.readyState == 'complete') {
        alert('IE6、IE7 support js.onreadystatechange');
      }
    }
  }
  return false;
}

以上就是本文的全部内容,希望对大家的学习有所帮助。

Javascript 相关文章推荐
js和jquery使按钮失效为不可用状态的方法
Jan 26 Javascript
ExtJS4利根据登录后不同的角色分配不同的树形菜单
May 02 Javascript
js图片自动轮播代码分享(js图片轮播)
May 06 Javascript
简介JavaScript中valueOf()方法的使用
Jun 05 Javascript
JavaScript使用RegExp进行正则匹配的方法
Jul 11 Javascript
JavaScript动态创建form表单并提交的实现方法
Dec 10 Javascript
javascript实现图片左右滚动效果【可自动滚动,有左右按钮】
Sep 19 Javascript
Javascript 制作图形验证码实例详解
Dec 22 Javascript
纯js实现倒计时功能
Jan 06 Javascript
Javascript中从学习bind到实现bind的过程
Jan 05 Javascript
vue的安装及element组件的安装方法
Mar 09 Javascript
Vue 基于 vuedraggable 实现选中、拖拽、排序效果
May 18 Javascript
jQuery动画显示和隐藏效果实例演示(附demo源码下载)
Dec 31 #Javascript
详解javascript高级定时器
Dec 31 #Javascript
jQuery动画效果相关方法实例分析
Dec 31 #Javascript
js实现文字垂直滚动和鼠标悬停效果
Dec 31 #Javascript
jquery正则表达式验证(手机号、身份证号、中文名称)
Dec 31 #Javascript
jQuery语法小结(超实用)
Dec 31 #Javascript
解决JS无法调用Controller问题的方法
Dec 31 #Javascript
You might like
PHP常用的小程序代码段
2015/11/14 PHP
YII CLinkPager分页类扩展增加显示共多少页
2016/01/29 PHP
php读取txt文件并将数据插入到数据库
2016/02/23 PHP
使用Modello编写JavaScript类
2006/12/22 Javascript
window.onload 加载完毕的问题及解决方案(下)
2009/07/09 Javascript
javascript 面向对象编程  function是方法(函数)
2009/09/17 Javascript
Javascript isArray 数组类型检测函数
2009/10/08 Javascript
Textbox控件注册回车事件及触发按钮提交事件具体实现
2013/03/04 Javascript
JS 打印界面的CSS居中代码适用所有浏览器
2014/03/19 Javascript
jquery动态添加文本并获取值的方法
2016/10/12 Javascript
Javascript typeof与instanceof的区别
2016/10/18 Javascript
Bootstrap源码解读导航(6)
2016/12/23 Javascript
nodejs mysql 实现分页的方法
2017/06/06 NodeJs
JavaScript严格模式下关于this的几种指向详解
2017/07/12 Javascript
React Native中TabBarIOS的简单使用方法示例
2017/10/13 Javascript
JavaScript中利用Array filter() 方法压缩稀疏数组
2018/02/24 Javascript
angular 实时监听input框value值的变化触发函数方法
2018/08/31 Javascript
vscode下vue项目中eslint的使用方法
2019/01/13 Javascript
laravel-admin 与 vue 结合使用实例代码详解
2019/06/04 Javascript
echarts大屏字体自适应的方法步骤
2019/07/12 Javascript
vue 接口请求地址前缀本地开发和线上开发设置方式
2020/08/13 Javascript
200行自定义python异步非阻塞Web框架
2017/03/15 Python
Python实现接受任意个数参数的函数方法
2018/04/21 Python
Python多线程编程之多线程加锁操作示例
2018/09/06 Python
python使用Pandas库提升项目的运行速度过程详解
2019/07/12 Python
python中eval与int的区别浅析
2019/08/11 Python
Python的几种主动结束程序方式
2019/11/22 Python
使用tqdm显示Python代码执行进度功能
2019/12/08 Python
美国正宗设计师眼镜在线零售商:EYEZZ
2019/03/23 全球购物
大学生工作推荐信范文
2013/12/02 职场文书
犯错检讨书
2014/02/21 职场文书
工程承诺书怎么写
2014/05/24 职场文书
职位证明模板
2015/06/23 职场文书
python实现图片九宫格分割的示例
2021/04/25 Python
Javascript 解构赋值详情
2021/11/17 Javascript
mysql幻读详解实例以及解决办法
2022/06/16 MySQL