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 相关文章推荐
jquery 必填项判断表单是否为空的方法
Sep 14 Javascript
防止按钮在短时间内被多次点击的方法
Mar 10 Javascript
js实现上传图片预览的方法
Feb 09 Javascript
ECMAScript 5严格模式(Strict Mode)介绍
Mar 02 Javascript
JS实现星星评分功能实例代码(两种方法)
Jun 09 Javascript
Bootstrap 模态框(Modal)插件代码解析
Dec 21 Javascript
vue使用Axios做ajax请求详解
Jun 07 Javascript
JS 实现banner图片轮播效果(鼠标事件)
Aug 04 Javascript
微信小程序使用radio显示单选项功能【附源码下载】
Dec 11 Javascript
vue项目刷新当前页面的三种方法
Dec 04 Javascript
vue如何实现动态加载脚本
Feb 05 Javascript
基于jQuery拖拽事件的封装
Nov 29 jQuery
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实现头像上传预览功能
2017/04/27 PHP
关于flash遮盖div浮动层的解决方法
2010/07/17 Javascript
jQuery实现类似滑动门切换效果的层切换
2013/09/23 Javascript
iframe窗口高度自适应的又一个巧妙实现思路
2014/04/04 Javascript
JavaScript获得url查询参数的方法
2015/07/02 Javascript
javascript的replace方法结合正则使用实例总结
2016/06/16 Javascript
解析JavaScript模仿块级作用域
2016/12/29 Javascript
jQuery+HTML5实现弹出创意搜索框层
2016/12/29 Javascript
Angular 4依赖注入学习教程之InjectToken的使用(八)
2017/06/04 Javascript
Vue.js如何实现路由懒加载浅析
2017/08/14 Javascript
JavaScript实现body内任意节点的自定义属性功能示例
2017/09/18 Javascript
原生javascript实现文件异步上传的实例讲解
2017/10/26 Javascript
Layui表格行工具事件与数据回填方法
2019/09/13 Javascript
Vertx基于EventBus发送接受自定义对象
2020/11/16 Javascript
[05:20]卡尔工作室_DOTA2新手教学_DOTA2超强新手功能
2013/04/22 DOTA
python读取与写入csv格式文件的示例代码
2017/12/16 Python
Python爬虫工程师面试问题总结
2018/03/22 Python
Python实现自定义顺序、排列写入数据到Excel的方法
2018/04/23 Python
在CMD命令行中运行python脚本的方法
2018/05/12 Python
利用python库在局域网内传输文件的方法
2018/06/04 Python
python中协程实现TCP连接的实例分析
2018/10/14 Python
python 使用值来排序一个字典的方法
2018/11/16 Python
python读取txt文件,去掉空格计算每行长度的方法
2018/12/20 Python
Python实现获取系统临时目录及临时文件的方法示例
2019/06/26 Python
python树的同构学习笔记
2019/09/14 Python
python中把元组转换为namedtuple方法
2020/12/09 Python
CSS3 flex布局之快速实现BorderLayout布局
2015/12/03 HTML / CSS
Html5移动端弹幕动画实现示例代码
2018/08/27 HTML / CSS
万年牢教学反思
2014/02/15 职场文书
年检委托书
2014/08/30 职场文书
闪闪的红星观后感
2015/06/08 职场文书
独生子女证明范本
2015/06/19 职场文书
房屋产权证明书
2015/06/19 职场文书
Nginx快速入门教程
2021/03/31 Servers
MySQL一劳永逸永久支持输入中文的方法实例
2022/08/05 MySQL
微软Win11 全新照片应用面向 Dev预览版推出 新版本上手体验图集
2022/09/23 数码科技