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 相关文章推荐
Jquery调用webService远程访问出错的解决方法
May 21 Javascript
详解JavaScript对W3C DOM模版的支持情况
Jun 16 Javascript
jquery.map()方法的使用详解
Jul 09 Javascript
javascript控制图片播放的实现代码
Jul 29 Javascript
学习JavaScript设计模式(封装)
Nov 26 Javascript
浏览器兼容性问题大汇总
Dec 17 Javascript
Bootstrap中glyphicons-halflings-regular.woff字体报404错notfound的解决方法
Jan 19 Javascript
bootstrapValidator.min.js表单验证插件
Feb 09 Javascript
ionic环境配置及问题详解
Jun 27 Javascript
jQuery实现table表格信息的展开和缩小功能示例
Jul 21 jQuery
基于bootstrap页面渲染的问题解决方法
Aug 09 Javascript
Nautil 中使用双向数据绑定的实现
Oct 02 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性能的21种方法介绍
2013/06/25 PHP
PHP文件锁函数flock()详细介绍
2014/11/18 PHP
解决微信授权回调页面域名只能设置一个的问题
2016/12/11 PHP
laravel框架邮箱认证实现方法详解
2019/11/22 PHP
Javascript客户端将指定区域导出到Word、Excel的代码
2008/10/22 Javascript
js根据给定的日期计算当月有多少天实现思路及代码
2013/02/25 Javascript
JS判断字符串长度的5个方法(区分中文和英文)
2014/03/18 Javascript
用Jquery选择器计算table中的某一列某一行的合计
2014/08/13 Javascript
js+css实现上下翻页相册代码分享
2015/08/18 Javascript
JS实现的鼠标跟随代码(卡通手型点击效果)
2015/10/26 Javascript
只要1K 纯JS脚本送你一朵3D红色玫瑰
2016/08/09 Javascript
jQuery实现的仿百度,仿谷歌搜索下拉框效果示例
2016/12/30 Javascript
javaScript中的空值和假值
2017/12/18 Javascript
Vue.js中的computed工作原理
2018/03/22 Javascript
node.js使用redis储存session的方法
2018/09/26 Javascript
微信小程序时间控件picker view使用详解
2018/12/28 Javascript
下载安装setuptool和pip linux安装pip    
2014/01/24 Python
在SAE上部署Python的Django框架的一些问题汇总
2015/05/30 Python
Python实现确认字符串是否包含指定字符串的实例
2018/05/02 Python
对python的bytes类型数据split分割切片方法
2018/12/04 Python
python将txt文档每行内容循环插入数据库的方法
2018/12/28 Python
python关于矩阵重复赋值覆盖问题的解决方法
2019/07/19 Python
python计算n的阶乘的方法代码
2019/10/25 Python
Win下PyInstaller 安装和使用教程
2019/12/25 Python
小 200 行 Python 代码制作一个换脸程序
2020/05/12 Python
超级实用的8个Python列表技巧
2020/08/24 Python
Python numpy大矩阵运算内存不足如何解决
2020/11/19 Python
利用Python如何画一颗心、小人发射爱心
2021/02/21 Python
将世界上最美丽的摄影作品转化为艺术作品:Photos.com
2017/11/28 全球购物
经济实惠的名牌太阳镜和眼镜:Privé Revaux
2021/02/07 全球购物
如何唤起类中的一个方法
2013/11/29 面试题
质量工程师岗位职责
2013/11/16 职场文书
淘宝活动总结范文
2014/06/26 职场文书
授权委托书样本
2014/09/25 职场文书
中国文明网向国旗敬礼寄语大全
2014/09/27 职场文书
党的群众路线教育实践活动制度建设计划方案
2014/10/31 职场文书