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 组件之旅(三):用 Ant 构建组件
Oct 28 Javascript
ASP Json Parser修正版
Dec 06 Javascript
js的[defer]和[async]属性
Nov 24 Javascript
JavaScript修改作用域外变量的方法
Mar 25 Javascript
JavaScript生成带有缩进的表格代码
Jun 15 Javascript
jQuery事件处理的特征(事件命名机制)
Aug 23 Javascript
Bootstrap栅格系统学习笔记
Nov 25 Javascript
微信小程序 scroll-view实现上拉加载与下拉刷新的实例
Jan 21 Javascript
使用Vue开发自己的Chrome扩展程序过程详解
Jun 21 Javascript
基于JS抓取某高校附近共享单车位置 使用web方式展示位置变化代码实例
Aug 27 Javascript
vue实现输入一位数字转汉字功能
Dec 13 Javascript
js加减乘除精确运算方法实例代码
Jan 17 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实现小型站点广告管理(修正版)
2006/10/09 PHP
PHP中error_reporting()函数的用法(修改PHP屏蔽错误)
2011/07/01 PHP
一个简单的php加密解密函数(动态加密)
2013/06/19 PHP
浅析php中常量,变量的作用域和生存周期
2013/08/10 PHP
CodeIgniter启用缓存和清除缓存的方法
2014/06/12 PHP
你应该知道PHP浮点数知识
2015/05/13 PHP
调试WordPress中定时任务的相关PHP脚本示例
2015/12/10 PHP
PHP 对象接口简单实现方法示例
2020/04/13 PHP
Javascript !!的作用
2008/12/04 Javascript
jQuery '行 4954 错误: 不支持该属性或方法' 的问题解决方法
2011/01/19 Javascript
主页面中的两个iframe实现鼠标拖动改变其大小
2013/04/16 Javascript
js实现鼠标拖动图片并兼容IE/FF火狐/谷歌等主流浏览器
2013/06/06 Javascript
javascript面向对象之定义成员方法实例分析
2015/01/13 Javascript
js jquery获取当前元素的兄弟级 上一个 下一个元素
2015/09/01 Javascript
第十章之巨幕页头缩略图与警告框组件
2016/04/25 Javascript
Bootstrap模态框水平垂直居中与增加拖拽功能
2016/11/09 Javascript
angularjs 页面自适应高度的方法
2018/01/17 Javascript
详解VUE前端按钮权限控制
2019/04/26 Javascript
跟老齐学Python之不要红头文件(1)
2014/09/28 Python
用Python进行TCP网络编程的教程
2015/04/29 Python
Python中函数的参数定义和可变参数用法实例分析
2015/06/04 Python
python实现图片筛选程序
2018/10/24 Python
Python实现的银行系统模拟程序完整案例
2019/04/12 Python
opencv python 图片读取与显示图片窗口未响应问题的解决
2020/04/24 Python
Python调用shell cmd方法代码示例解析
2020/06/18 Python
新加坡第一的杂货零售商:NTUC FairPrice
2020/12/05 全球购物
邮政员工辞职信
2014/01/16 职场文书
元旦晚会主持词
2014/03/24 职场文书
小学英语课后反思
2014/04/26 职场文书
社区清明节活动总结
2014/07/04 职场文书
商铺门面租房协议书
2014/10/21 职场文书
机关工会工作总结2015
2015/05/26 职场文书
谁动了我的奶酪读书笔记
2015/06/30 职场文书
电力企业职工培训心得体会
2016/01/11 职场文书
八年级作文之友情
2019/11/25 职场文书
vue-cli3.0修改打包后的文件名和文件地址,打包后本地运行报错解决
2022/04/06 Vue.js