JS图片预加载三种实现方法解析

 更新时间:2020年05月08日 10:29:36   作者:阿吉莱加雷  
这篇文章主要介绍了JS图片预加载三种实现方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

预加载基本概念:当页面打开图片提前加载,并且缓存在用户本地,需要用到时直接进行渲染;在浏览图片较多的网页(百度图库,淘宝京东等),可以有更好的用户体验;

一张图片的预加载

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 Promise多并发问题的解决方法详解

    JavaScript Promise多并发问题的解决方法详解

    提起控制并发,大家应该不陌生,这篇文章主要来和大家介绍一下JavaScript如何解决Promise多并发问题,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-09-09
  • Webpack常见使用配置小结

    Webpack常见使用配置小结

    本文主要介绍了Webpack常见使用配置小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • go.js的基本使用方法详解【与vue,react同理】

    go.js的基本使用方法详解【与vue,react同理】

    这篇文章主要介绍了go.js的基本使用方法,结合实例形式详细分析了go.js基本功能、原理及vue中使用方法,需要的朋友可以参考下
    2023-06-06
  • 浅析js中base64与file的转换

    浅析js中base64与file的转换

    这篇文章主要为大家详细介绍了JavaScript中base64与file的转换的实现方法,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-09-09
  • JavaScript如何将伪数组转换成数组 

    JavaScript如何将伪数组转换成数组 

    这篇文章主要介绍了JavaScript如何将伪数组转换成数组, 伪数组的主要特征是一个对象,并且该对象有length属性,更多参考内容,需要的小伙伴可以参考一下
    2022-07-07
  • JS实现可拖曳、可关闭的弹窗效果

    JS实现可拖曳、可关闭的弹窗效果

    这篇文章主要介绍了JS实现可拖曳、可关闭的弹窗效果,可实现点击文字弹出可拖动的窗口,同时背景出现变暗的遮罩效果,点击遮罩层即可关闭弹出,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09
  • 微信小程序中的上拉、下拉菜单功能

    微信小程序中的上拉、下拉菜单功能

    这篇文章主要介绍了微信小程序中的上拉、下拉菜单功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • JavaScript基础教程之如何实现一个简单的promise

    JavaScript基础教程之如何实现一个简单的promise

    看了些promise的介绍,还是感觉不够深入,所以下面这篇文章主要给大家介绍了关于JavaScript基础教程之如何实现一个简单的promise的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-09-09
  • eclipse如何忽略js文件报错(附图)

    eclipse如何忽略js文件报错(附图)

    eclipse中js文件报错的情况,或许大家早已习以为常了,那么有什么好的方法可以将其忽略掉呢?如果你也在寻找此问题,那么本文或许可以帮助到你
    2013-10-10
  • 使用bootstrap-paginator.js 分页来进行ajax 异步分页请求示例

    使用bootstrap-paginator.js 分页来进行ajax 异步分页请求示例

    本篇文章主要介绍了使用bootstrap-paginator.js 分页来进行ajax 异步分页请求示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03

最新评论