JS图片预加载三种实现方法解析


Posted in Javascript onMay 08, 2020

预加载基本概念:当页面打开图片提前加载,并且缓存在用户本地,需要用到时直接进行渲染;在浏览图片较多的网页(百度图库,淘宝京东等),可以有更好的用户体验;

一张图片的预加载

var img=new Image();
    img.addEventListener("load",loadHandler);
    img.src="./img/1.jpg";
    document.body.appendChild(img);
    console.log(img.width);

    function loadHandler(e){
      console.log(img.width);//当前图片的原始宽度
    }

上面代码中,图片还没加载完成打印图片的宽度时,图片宽度为0;只有等图片加载完成后并写入DOM树渲染后,才去触发load事件的回调函数,才能打印出图片的宽度;

加载多张图片时,要提前在本地进行缓存,下面要讲三种预加载多张图片的例子:

第一种:load预加载

加载100张图片,且图片名为1.jpg~100.jpg(下同);

var num=1;
    var list=[];
    loadImage();
    function loadImage(){
      var img=new Image();
      img.addEventListener("load",loadHandler);
      img.src="./img/"+num+".jpg";
    }
    function loadHandler(e){
      list.push(this.cloneNode());//复制当前图片元素
      num++;
      if(num>100){console.log(list);return;}
      this.src="./img/"+num+".jpg"; //修改地址继续后触发load事件
    }

上面代码表示:

1、创建一张图片;

2、给这个图片增加事件侦听load;

3、加载完成后,将加载进来的图片复制一个新的,放在数组中;

4、修改num;如果num的值大于100停止执行,并且打印数组;

5、给这个图片的地址赋予一个新地址,因为改变图片的地址就会重新触发load,所以会继续进入loadHandler函数,不断加载,直到加载完成。

第二种:生成器函数实现预加载

function loadImage(src){
    return new Promise(function(resolve,reject){
      let img=new Image();
      img.onload=function(){ 
        resolve(img);//加载时执行resolve函数
      }
      img.onerror=function(){ 
        reject(src+'这个地址错误');//抛出异常时执行reject函数
      }
      img.src=src;
    })
  }
  function* fn(){
    for(let i=1;i<100;i++){
      yield loadImage("./img/"+i+".jpg");
    }
  }
  let s=fn();
  let value=s.next().value; 
  resume();
  function resume(){
    value.then(img=>{
      console.log(img);//打印加载的图片标签
      value=s.next().value;
      if(value)resume();
    });
  }

以上代码表示:

1、执行生成器函数并且一次执行loadImage 函数;

2、在Promise中创建图片;

3、判断图片是否可以加载,加载成功执行Promise的回调函数resolve;

4、执行一次resume函数,并在函数里面执行Promise在resolved状态下的函数

5、反复执行s.next().value,直到全部图片加载完成;

第三种:async/await预加载图片

function loadImage(src){
    let p=new Promise(function(resolve,reject){
      let img=new Image();
      img.onload=function(){//加载时执行resolve函数
        resolve(img);
      }
      img.onerror=function(){
        reject(src);
      }
      img.src=src;
    })
    return p;
  }
  async function fn(){
    let arr=[];
    for(let i=3;i<80;i++){
      await loadImage(`./img/${i}-.jpg`).then(img=>{
        arr.push(img);
      });
    }
    return arr;
  }
  fn().then(list=>{
    console.log(list);//打印图片数组
  })

这种方法是ES6的方法用到了async和await将异步转换为阻塞式同步;

说明:

1、fn 这个函数使用async 表示这个函数是一个异步函数

2、这个函数中就可以使用await ,await作用就是让异步变为同步等待,异步变成了阻塞式等待

3、当异步全部完成时,再继续向后运行

4、async函数中的await后面只能跟的时Promise对象

5、async函数执行后返回的是一个Promise对象

以上就是三种预加载的方法,仅供参考;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 学习初步 入门教程
Mar 25 Javascript
javascript中关于break,continue的特殊用法与介绍
May 24 Javascript
jQuery地图map悬停显示省市代码分享
Aug 20 Javascript
javascript实现图片延迟加载方法汇总(三种方法)
Aug 27 Javascript
jquery图片轮播特效代码分享
Apr 20 Javascript
jQuery实用技巧必备(上)
Nov 02 Javascript
基于BootStrap Metronic开发框架经验小结【六】对话框及提示框的处理和优化
May 12 Javascript
JavaScript中0和&quot;&quot;比较引发的问题
May 26 Javascript
AngularJS 自定义过滤器详解及实例代码
Sep 14 Javascript
iview中Select 选择器多选校验方法
Mar 15 Javascript
js实现3D旋转相册
Aug 02 Javascript
vue组件中传值EventBus的使用及注意事项说明
Nov 16 Javascript
JavaScript ES6 Class类实现原理详解
May 08 #Javascript
JavaScript cookie原理及使用实例
May 08 #Javascript
JavaScript中的各种宽高属性的实现
May 08 #Javascript
element-ui 实现响应式导航栏的示例代码
May 08 #Javascript
JS控制下拉列表左右选择实例代码
May 08 #Javascript
VSCode搭建React Native环境
May 07 #Javascript
Javascript查看大图功能代码实现
May 07 #Javascript
You might like
php UTF8 文件的签名问题
2009/10/30 PHP
php将fileterms函数返回的结果变成可读的形式
2011/04/21 PHP
php对称加密算法示例
2014/05/07 PHP
PHP文件读取功能的应用实例
2015/05/08 PHP
PHP + plupload.js实现多图上传并显示进度条加删除实例代码
2017/03/06 PHP
javascript中的对象和数组的应用技巧
2007/01/07 Javascript
javascript笔试题目附答案@20081025_jb51.net
2008/10/26 Javascript
jquery动画1.加载指示器
2012/08/24 Javascript
javascript重写alert方法的实例代码
2013/03/29 Javascript
JS实现固定在右下角可展开收缩DIV层的方法
2015/02/13 Javascript
jQuery中animate动画第二次点击事件没反应
2015/05/07 Javascript
浅谈JavaScript中的字符编码转换问题
2015/07/07 Javascript
利用JS实现数字增长
2016/07/28 Javascript
关于vue.js弹窗组件的知识点总结
2016/09/11 Javascript
JS简单去除数组中重复项的方法
2016/09/13 Javascript
多个上传文件用js验证文件的格式和大小的方法(推荐)
2017/03/09 Javascript
JavaScript实现无穷滚动加载数据
2017/05/06 Javascript
jquery处理checkbox(复选框)是否被选中实例代码
2017/06/12 jQuery
w3c编程挑战_初级脚本算法实战篇
2017/06/23 Javascript
详解Vue单元测试Karma+Mocha学习笔记
2018/01/31 Javascript
vue使用jsonp抓取qq音乐数据的方法
2018/06/21 Javascript
JavaScript ECMA-262-3 深入解析(一):执行上下文实例分析
2020/04/25 Javascript
[01:24:51]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第二场
2014/05/26 DOTA
python实现文本去重且不打乱原本顺序
2016/01/26 Python
Django1.9 加载通过ImageField上传的图片方法
2018/05/25 Python
Django框架视图介绍与使用详解
2019/07/18 Python
HTML5画渐变背景图片并自动下载实现步骤
2013/11/18 HTML / CSS
英国最大的女士服装零售商:Bonmarché
2017/08/17 全球购物
西安众合通用.net笔试题
2013/03/18 面试题
自荐信包含哪些内容
2013/10/30 职场文书
资料员的岗位职责
2013/11/20 职场文书
高中班级口号
2014/06/09 职场文书
创先争优活动心得体会
2014/09/04 职场文书
祖国在我心中演讲稿(小学生)
2014/09/23 职场文书
2015应届毕业生求职信范文
2015/03/20 职场文书
2016年过年放假安排通知
2015/08/18 职场文书