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使用call调用微信API
Dec 15 Javascript
JavaScript中iframe实现局部刷新的几种方法汇总
Jan 06 Javascript
Javascript基础_标记文字的实现方法
Jun 14 Javascript
浅谈MVC+EF easyui dataGrid 动态加载分页表格
Nov 10 Javascript
jquery+ajax实现省市区三级联动 (封装和不封装两种方式)
May 15 jQuery
Angular2生命周期钩子函数的详细介绍
Jul 10 Javascript
JavaScript表单即时验证 验证不成功不能提交
Aug 31 Javascript
Vue父子组建的简单通信之控制开关Switch的实现
Jun 04 Javascript
jQuery模拟html下拉多选框的原生实现方法示例
May 30 jQuery
vue使用混入定义全局变量、函数、筛选器的实例代码
Jul 29 Javascript
WebPack工具运行原理及入门教程
Dec 02 Javascript
vue+django实现下载文件的示例
Mar 24 Vue.js
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
CodeIgniter实现更改view文件夹路径的方法
2014/07/04 PHP
PHP实现微信网页授权开发教程
2016/01/19 PHP
PHP的几个常用加密函数
2016/02/03 PHP
php中各种定义变量的方法小结
2017/10/18 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
2020/03/27 PHP
通过隐藏option实现select的联动效果
2009/11/10 Javascript
JavaScript DOM 学习总结(五)
2015/11/24 Javascript
Bootstrap对话框使用实例讲解
2016/09/24 Javascript
javascript实现日期三级联动下拉框选择菜单
2020/12/03 Javascript
基于vue.js路由参数的实例讲解——简单易懂
2017/09/07 Javascript
vue仿element实现分页器效果
2018/09/13 Javascript
JavaScript canvas绘制圆弧与圆形
2020/02/18 Javascript
详解Vue.js3.0 组件是如何渲染为DOM的
2020/11/10 Javascript
[39:52]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第一场
2018/04/04 DOTA
Pyramid Mako模板引入helper对象的步骤方法
2013/11/27 Python
浅谈Python的文件类型
2016/05/30 Python
python登录WeChat 实现自动回复实例详解
2019/05/28 Python
python怎么提高计算速度
2020/06/11 Python
Anaconda使用IDLE的实现示例
2020/09/23 Python
利用python批量爬取百度任意类别的图片的实现方法
2020/10/07 Python
python 写一个性能测试工具(一)
2020/10/24 Python
python中entry用法讲解
2020/12/04 Python
html5实现多文件的上传示例代码
2014/02/13 HTML / CSS
Tech21美国/加拿大:英国NO.1防摔保护壳品牌
2018/01/20 全球购物
网络维护管理员的自我评价分享
2013/11/11 职场文书
12岁生日感言
2014/01/21 职场文书
水利学院求职自荐书
2014/02/01 职场文书
《明天,我们毕业》教学反思
2014/04/24 职场文书
公司投资建议书
2014/05/16 职场文书
英文产品推荐信
2015/03/27 职场文书
2015年医药代表工作总结
2015/04/25 职场文书
2016年寒假见闻
2015/10/10 职场文书
团支部组织委员竞选稿
2015/11/21 职场文书
2016领导干部廉洁自律心得体会
2016/01/13 职场文书
创业计划书之物流运送
2019/09/17 职场文书
分享很少见很有用的SQL功能CORRESPONDING
2022/08/05 MySQL