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引用对象的方法
Jan 11 Javascript
使用JavaScript switch case 另类写法
Mar 14 Javascript
js日期时间补零的小例子
Mar 05 Javascript
详解Matlab中 sort 函数用法
Mar 20 Javascript
JS控制层作圆周运动的方法
Jun 20 Javascript
基于JavaScript实现树形下拉框
Aug 10 Javascript
bootstrap daterangepicker双日历时间段选择控件详解
Jun 15 Javascript
详解Vue.js Mixins 混入使用
Sep 15 Javascript
微信小程序使用npm支持踩坑
Nov 07 Javascript
bootstrap下拉分页样式 带跳转页码
Dec 29 Javascript
微信小程序页面传多个参数跳转页面的实现方法
May 17 Javascript
浅谈JSON5解决了JSON的两大痛点
Dec 14 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
新闻分类录入、显示系统
2006/10/09 PHP
PHP面向对象的使用教程 简单数据库连接
2006/11/25 PHP
整合了前面的PHP数据库连接类~~做成一个分页类!
2006/11/25 PHP
Smarty的配置与高级缓存技术分享
2012/06/05 PHP
将FCKeditor导入PHP+SMARTY的实现方法
2015/01/15 PHP
使用PHP uniqid函数生成唯一ID
2015/11/18 PHP
PHP中常用的数组操作方法笔记整理
2016/05/16 PHP
PHP进程通信基础之信号
2017/02/19 PHP
许愿墙中用到的函数
2006/10/07 Javascript
js函数使用技巧之 setTimeout(function(){},0)
2009/02/09 Javascript
JavaScript 设计模式学习 Singleton
2009/07/27 Javascript
js 省地市级联选择
2010/02/07 Javascript
js判断选择时间不能小于当前时间的示例代码
2013/09/24 Javascript
使图片旋转的3种解决方案
2013/11/21 Javascript
javascripit实现密码强度检测代码分享
2013/12/12 Javascript
Vue.js 表单校验插件
2016/08/14 Javascript
bootstrap与Jquery UI 按钮样式冲突的解决办法
2016/09/23 Javascript
JS实现禁止鼠标右键的功能
2016/10/15 Javascript
js 用于检测类数组对象的函数方法
2017/05/02 Javascript
基于复选框demo(分享)
2017/09/27 Javascript
微信小程序实现全国机场索引列表
2018/01/31 Javascript
node.JS二进制操作模块buffer对象使用方法详解
2020/02/06 Javascript
Python实现的RSS阅读器实例
2015/07/25 Python
详解Django中CBV(Class Base Views)模型源码分析
2019/02/25 Python
Python的几种主动结束程序方式
2019/11/22 Python
jupyter 使用Pillow包显示图像时inline显示方式
2020/04/24 Python
python多线程实现同时执行两个while循环的操作
2020/05/02 Python
解决html5中的video标签ios系统中无法播放使用的问题
2020/08/10 HTML / CSS
美国时尚配饰品牌:Dooney & Bourke
2017/11/14 全球购物
Yahoo的PHP面试题
2014/05/26 面试题
在职证明书范本(2014新版)
2014/09/25 职场文书
学雷锋倡议书
2015/01/19 职场文书
辞职信范文大全
2015/03/02 职场文书
公司员工辞职信范文
2015/05/12 职场文书
2016年优秀团员事迹材料
2016/02/25 职场文书
MutationObserver在页面水印实现起到的作用详解
2022/07/07 Javascript