首页 > 其他分享 >封装一个批量加载图片的工具类

封装一个批量加载图片的工具类

时间:2024-08-10 23:49:22浏览次数:11  
标签:INDEX 封装 批量 img CURRENT QUANTITY imgInfo 加载

遇到一个面试题,把其中一部分功能单独封装了一个批量加载图片的class。

斗胆擅自加了一点功能,

1、 配置第一批同时发起load的图片数量(默认5张)。

2、无论成败,每结束一张图片加载自动加载下一张。

3、每张图片右侧实时展示目前加载状态(ready,pendding,success,failed)。

代码还在完善中,先上代码后续更新:

class ImgsLoader {
                constructor(srcs = [], BATCH_QUANTITY = 10) {
                    this.TOTAL_QUANTITY = srcs.length;
                    this.BATCH_QUANTITY = BATCH_QUANTITY;
                    this.IMG_INFOS = srcs.map((src, index) => {
                        this.PROGRESS = 0;
                        const dom = document.createElement('div');
                        dom.id = `innerItem-${index}`;
                        const progressText = document.createElement('span');
                        progressText.id = `innerItemText-${index}`;
                        progressText.innerText = "等待加载中...";
                        const img = new Image();
                        dom.appendChild(img);
                        dom.appendChild(progressText);
                        const imgInfo = {
                            src,
                            index,
                            status: 0, // 0: ready,1: pendding,2:success,3:failed
                            progress: 0,
                            progressText,
                            dom,
                            img
                        }
                        return imgInfo;
                    });
                }
                mount(selector) {
                    this.SELECTOR = selector;
                    if (!this.SELECTOR){
                        return;
                    }
                    this.IMG_INFOS.forEach(({dom}) => document.querySelector(this.SELECTOR)?.appendChild?.(dom));
                    this.IMG_INFOS.slice(0, this.BATCH_QUANTITY)?.forEach?.(imgInfo => {
                        this.load(imgInfo);
                    });
                }
                TOTAL_QUANTITY = 0;
                IMG_INFOS = [];
                SUCCESS_LIST = [];
                FAILED_LIST = [];
                BATCH_QUANTITY = 10;
                CURRENT_INDEX = 0;
                PROGRESS = 0;
                SELECTOR = null;
                async load(imgInfo) {
                    return new Promise((resolve, reject) => {
                        const img = imgInfo.img;
                        imgInfo.status = 1;
                        img.onload = () => {
                            img.onload = null;
                            imgInfo.status = 2; // 0: ready,1: pendding,2:success,3:failed
                        }
                        img.onerror = () => {
                            img.onerror = null;
                            img.onabort = null;
                            imgInfo.status = 3; // 0: ready,1: pendding,2:success,3:failed
                        }
                        img.onabort = img.onerror
                        img.src = imgInfo.src;
                        this.recursiveCheckStatus(imgInfo, resolve, reject);
                    });
                }
                recursiveCheckStatus(imgInfo, resolve, reject) {
                    requestAnimationFrame(() => {
                        // 0: ready,1: pendding,2:success,3:failed
                        if (imgInfo.status === 1) {
                            imgInfo.progress = imgInfo.progress < 100 ? (imgInfo.progress + 1) : imgInfo.progress;
                            imgInfo.progressText.innerText = `加载进度${imgInfo.progress}%`
                            setTimeout(this.recursiveCheckStatus.bind(this, imgInfo, resolve, reject), 500);
                            return;
                        }
                        if (imgInfo.status === 2) {
                            imgInfo.progressText.innerText = "加载成功"
                            if ((this.CURRENT_INDEX + 1) < this.TOTAL_QUANTITY) {
                                this.CURRENT_INDEX++;
                                const nextInfo = this.IMG_INFOS.find(({index}) => index === this.CURRENT_INDEX);
                                nextInfo && this.load(nextInfo);
                            }
                            this.PROGRESS = this.CURRENT_INDEX + 1;
                            resolve?.();
                            return;
                        }
                        if (imgInfo.status === 3) {
                            imgInfo.progressText.innerText = "加载失败"
                            if ((this.CURRENT_INDEX + 1) < this.TOTAL_QUANTITY) {
                                this.CURRENT_INDEX++;
                                const nextInfo = this.IMG_INFOS.find(({index}) => index === this.CURRENT_INDEX);
                                nextInfo && this.load(nextInfo);
                            }
                            this.PROGRESS = this.CURRENT_INDEX + 1;
                            reject?.();
                        }
                    })
                }
            }
            
         
            // 使用:
            const loader = new ImgsLoader(['https://img1.baidu.com/it/u=754329322,2526521035&fm=253&fmt=auto&app=138&f=JPEG?w=889&h=500', 'https://img0.baidu.com/it/u=3749906677,2827831142&…p;fmt=auto&amp;app=120&amp;f=JPEG?w=800&amp;h=500', 'https://img2.baidu.com/it/u=3200016476,4256473359&fm=253&fmt=auto&app=138&f=PNG?w=360&h=200'], 2)
            loader.mount("#list");

 

标签:INDEX,封装,批量,img,CURRENT,QUANTITY,imgInfo,加载
From: https://www.cnblogs.com/zhuxiaoweb/p/18352968

相关文章

  • python 提取日志错误请求批量重新请求
    因为有服务器线上偶发异常,所以需要获取Nginx访问日志重新请求补全数据,这时会借助python获取错误请求的URL,然后重新请求。具体如下:importtimeimportrequestsfromurllib.parseimporturljoin#定义一个集合用于存储已处理的URL,避免重复处理processed_urls=set()with......
  • mysql load data file 批量导入数据
    mysql大量数据导入记录工作需要将大量数据导入到mysql中,但是数据量很大且几十个文本数据,每次导入的数据量有限制,所以需要分批导入。为了快速导入记录下使用loaddatainfile方式。1.SQL入数据语句先将数据传入/var/lib/mysql/test/路径mysql>loaddatainfile"/var/li......
  • 013.Vue3入门,在App.vue中加载显示子页面
    1、App.vue代码如下:<scriptsetup>importTestpage001from'./view/Testpage001.vue'</script><template><Testpage001/></template><style></style>2、如图所示 3、Testpage001的代码如下:<template><......
  • 面向对象编程(OOP: Object Oriented Programming ):类、对象、构造方法、封装
    目录一、类1、定义(1)属性(2)方法2、类的定义方法二、对象1、定义2、对象的定义方法三、类和对象的关系1、现实世界都是由很多对象组成的,基于对象的共同特征抽象出类。2、对象:真实存在的对象3、类是对象的模板,对象是类的具体实例。4、一个类可以创建多个对象,同一个......
  • 帝国cms批量添加文章怎么设置
    帝国CMS批量添加文章的设置方法批量添加文章是帝国CMS中一项实用的功能,可以大幅提升内容管理效率。以下是如何设置批量添加文章:1.创建批量添加栏目进入帝国CMS后台,点击“栏目管理”。创建一个新的栏目,并将“模型”设置为“文章”。在“批量添加”选项卡下,选中“允许批量......
  • 帝国cms 批量替换字段值使用说明
    批量替换字段值一、批量替换字段值功能介绍:批量替换字段值为对信息表字段的内容进行批量替换。二、批量替换字段值:(一)、登录后台,单击“栏目”菜单,选择“批量替换字段值”子菜单,进入批量替换字段值界面:(二)、进入批量替换字段值界面:选择替换表选择要替换哪个表的字段。操......
  • Element学习(axios异步加载数据、案例操作)(5)
    1、这次学习的是上次还未完成好的恶element案例,对列表数据的异步加载,并渲染展示。——>axios来发送异步请求(1)(2)在vue当中安装axios(注意在当前的项目目录,并且安装完之后再将项目重启一下)(3)这里我用到数据的url地址为:https://mock.apifox.cn/m1/3128855-0-default/emp/list......
  • linux重新加载nginx配置的三种办法
    1.确保当前nginx进程运行中[root@master10~]#systemctlstatusnginx●nginx.service-ThenginxHTTPandreverseproxyserverLoaded:loaded(/usr/lib/systemd/system/nginx.service;disabled;vendorpreset:disabled)Active:active(running)sinceFri2......
  • edge浏览器加载java插件的方法
    在MicrosoftEdge浏览器中直接加载Java插件并不是一个直接支持的功能,因为Edge是基于Chromium内核的浏览器,主要支持Web技术如HTML、CSS和JavaScript。Java插件(通常指的是Java小程序,使用Java编程语言编写的应用程序)主要用于在早期的InternetExplorer浏览器中运行,但在现代浏览器中已......
  • 从Java类加载器源码浅析到线上热部署实现
    1Java代码的执行过程写了这么多代码,有没有想过我们的代码是怎么执行的?或者说定义了那么多类,我们的class是怎么加载到内存的?Java语言属于一种高级语言,而cpu能执行的只有机器码,所以Java代码的运行离不开jvm虚拟机的编译,下面用一张图说明在HotSpot虚拟机中Java代码加载到cpu执行的......