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 相关文章推荐
客户端脚本中常常出现的一些问题和调试技巧
Jan 09 Javascript
jQuery对象和DOM对象相互转化
Apr 24 Javascript
&amp;lt;script defer&amp;gt; defer 是什么意思
May 10 Javascript
jquery ajax执行后台方法
Mar 18 Javascript
editable.js 基于jquery的表格的编辑插件
Oct 24 Javascript
JavaScript 垃圾回收机制分析
Oct 10 Javascript
常用的JS验证和函数汇总
Dec 23 Javascript
jQuery unbind()方法实例详解
Jan 19 Javascript
Vue.js 2.0 移动端拍照压缩图片预览及上传实例
Apr 27 Javascript
angular动态表单制作
Feb 23 Javascript
简单了解微信小程序 e.target与e.currentTarget的不同
Sep 27 Javascript
Node.js中的异步生成器与异步迭代详解
Jan 31 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
雄兵连三大错觉:凯莎没了,凉冰阵亡了,华烨觉得自己又行了
2020/04/09 国漫
php 数组的一个悲剧?
2011/05/11 PHP
PHP实现的网站目录扫描索引工具
2016/09/08 PHP
PHP构造二叉树算法示例
2017/06/21 PHP
PHP中创建和编辑Excel表格的方法
2018/09/13 PHP
js计算页面刷新的次数
2009/07/20 Javascript
锋利的jQuery 要点归纳(二) jQuery中的DOM操作(下)
2010/03/23 Javascript
JS中 用户登录系统的解决办法
2013/04/15 Javascript
jquery分页插件jpaginate在IE中不兼容问题
2014/04/22 Javascript
使用时间戳解决ie缓存的问题
2014/08/20 Javascript
上传图片预览JS脚本 Input file图片预览的实现示例
2014/10/23 Javascript
jQuery扁平化风格下拉框美化插件FancySelect使用指南
2015/02/10 Javascript
javascript异步处理工作机制详解
2015/04/13 Javascript
逻辑表达式中与或非的用法详解
2016/06/06 Javascript
AngularJs表单验证实例代码解析
2016/11/29 Javascript
基于input框覆盖掉数字英文的实例讲解
2017/07/21 Javascript
JavaScript requestAnimationFrame动画详解
2017/09/14 Javascript
浅谈在Vue-cli里基于axios封装复用请求
2017/11/06 Javascript
JS/jQuery实现简单的开关灯效果【案例】
2019/02/19 jQuery
如何在Vue项目中添加接口监听遮罩
2021/01/25 Vue.js
python基础教程之Filter使用方法
2017/01/17 Python
使用python中的in ,not in来检查元素是不是在列表中的方法
2018/07/06 Python
python获取时间及时间格式转换问题实例代码详解
2018/12/06 Python
Python面向对象基础入门之设置对象属性
2018/12/11 Python
解决Python selenium get页面很慢时的问题
2019/01/30 Python
python中将两组数据放在一起按照某一固定顺序shuffle的实例
2019/07/15 Python
python实现图片中文字分割效果
2019/07/22 Python
对python中的装包与解包实例详解
2019/08/24 Python
Anaconda3中的Jupyter notebook添加目录插件的实现
2020/05/18 Python
办公室经理岗位职责
2014/01/01 职场文书
实习推荐信
2014/05/10 职场文书
ktv好的活动方案
2014/08/17 职场文书
中考学习决心书
2015/02/04 职场文书
房地产工程部经理岗位职责
2015/04/09 职场文书
2015年保险公司个人工作总结
2015/05/22 职场文书
病假条格式范文
2015/08/17 职场文书