基于JS怎样实现图片预加载,有哪些方法
Admin 2022-09-14 群英技术资讯 816 次浏览
在日常操作或是项目的实际应用中,有不少朋友对于“基于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对象
以上就是三种预加载的方法,仅供参考;
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
JavaScript 装逼指南(js另类写法),下面就是具体的写法,建议大家逐个测试一下,加深印象
main.js是我们的入口文件,主要作用是初始化vue实例,并引入所需要的插件,下面这篇文章主要给大家介绍了关于vue项目中main.js使用方法的相关资料,需要的朋友可以参考下
本文实例为大家分享了js实现按钮进行某行上移下移的具体代码,供大家参考,具体内容如下先上个通用简单的代码:<!DOCTYPE html><html><head><meta charset="utf-8"><meta http-eq
今天给大家分享的是关于vue实现dialog封装的内容,小编觉得挺实用的,因此分享给大家做个参考,下文还介绍了Vue2 写法、Vue3 插件版写法和Vue3 动态组件写法等等,感兴趣的朋友就继续往下看吧。
这篇文章主要介绍了Vue的混合继承,有需要的朋友可以借鉴参考下,希望能够有所帮助,希望能够给你带来帮助
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008