问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求助JS批量图片预加载的各种问题

发布网友 发布时间:2022-04-07 04:48

我来回答

3个回答

懂视网 时间:2022-04-07 09:09

什么是预加载:

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

一张图片的预加载

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对象

推荐教程:js入门教程

热心网友 时间:2022-04-07 06:17

var image_path = '/image/'; 
images = ['test1.jpg', 'test2.jpg']; 
for(var i = 0; i < images.length; i++) { 
var image_preload = new Image();

这个js你要放在<head></head>中,使用的话直接用你加载的这些image的路径就行

热心网友 时间:2022-04-07 07:35

imageload插件
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
电脑docx怎么转换成word文档电脑上docx格式文件转换方法 电脑白屏是怎么回事啊。??? 电脑开机花屏渐渐地白屏了显示器突然白屏花屏的原因及解决方法_百度知 ... iphone录屏失败因为5823什么意思_iphone录屏失败提示5823代表什么意思... 软考中级:信息安全工程师 求大神解答打印机如何设置默认双面打印 如何更改打印机的打印格式? 经期同房月经没了会怀孕吗 iphone8p轻触解锁设置 宝沃bx5300公里多少油钱 长的像苦瓜的水果里面是红色的籽可以吃的叫什么名字? 王者荣耀怎样取消绑定银行卡 王者荣耀怎样注销账号? 老梦到自己以前杀了人过了很久后被发现了然后开始逃亡 王者荣耀怎么永久注销账号 沙丁鱼大逃亡的环境因素 一个身份证绑定两个QQ王者荣耀怎么取消一个? 中国古代中原地区的几次大规模南迁都是什么时期 历史上大迁徙都有哪些? 为什么说史上最窝囊的逃亡就是北燕全国大逃亡呢? 梦见许多动物在逃亡,从身上经过 梦见一大堆蛇迁徙 梦见成群结队的蚂蚁集体迁徙是什么意思 生日当晚梦见给神仙佛像磕头!梦到一条街都是神仙佛像!我挨个磕头上香!最后玉皇大帝还给我说把香插到 天龙八部衣服打造图9级哪里买 哔卡哔卡的广告都是些什么来的?点击广告会收费吗?(会向点击的人收费吗?),我的好像点了主页和分类的 梦到家搬寺庙 给观音下下跪磕头上香 快手一键剪同款怎么取消 javascript怎样实现预加载js、css、图片呢?求高手,求demo 男人和女人不认识,喝酒了,却说要拿刀捅她,还说两次,是什么意思? windows7旗舰版 蓝牙连接手机的问题 三相四线电表怎么看实际用电量,这会儿刚安装好,就是不知道怎么看电量了? 三相四线电表怎么看实际用电量,有点懵,不知道怎么看实际用电量? 请问高手DTSD71型电子式三相四线多功能电能表怎样看? 吾尊男士洗面奶怎么样? 吾尊男士系列护肤品怎么样使用? 吾尊好用吗? 吾尊男士护肤品怎么样? 买了套韩束吾尊男士护肤品 请问那洗面奶是酸性还是碱性的?! 吾尊好欧莱雅男士洗面奶哪个好 proe饮料瓶瓶口螺纹怎么画 之前一直用吾尊洗面奶,现在换他男士,隔夜起来发现好多红点。起初以 吾尊男士护肤洗面奶 兰州市06年的GDP是多少 吾尊这个牌子的洗面奶效果如何? 男士用的护肤品,吾尊男士怎么样? 吾尊男士系列的洗面奶多少钱啊?有没有人用过? 用proe怎么画矿泉水瓶子?? 吾尊男士护肤有洗面奶吗 韩束吾尊男士洗面奶16岁可以用嘛?