js封装图片预加载

utils.js

var Utils = (function () {
    return {
        loadImage:function(arr,callback,basePath){
            if(typeof basePath==="string"){//如果传图片路径
                arr=arr.map(function(item){
                    return basePath+item;//把每一项的图片路径拼接到起来,放到数组中
                })
            }
            var img=new Image();//创建一个图片对象

            //预加载事件,src设置会触发预加载事件,这时候还没有设置src,所以不会触发
            img.addEventListener("load",this.loadHandler);
            
            img.addEventListener("error",this.loadHandler);//如果加载错误

            img.resultArr=[];//img是一个对象,可以添加数组
            img.num=0;
            img.arr=arr;
            img.self=this;//指当前对象Utils
            img.callback=callback;
            img.src=arr[0];//设置src,触发预加载事件,调用loadHandler函数,
        },

        //load事件是在图片被加载完成之后才会触发,调用这个函数时第一个图片已经加载完成,
        //然后复制一个图片对象,给这个图片对象设置src属性,等这个图片加载完成之后,然后再调用预加载事件,进行下一个图片对象的创建
        loadHandler:function(e){
            if(e.type!=="error")this.resultArr.push(this.cloneNode(false));//复制img对象放入到数组中,这里的img就是更改了src之后的图片
            this.num++;

            //如果复制的图片对象等于原本数组的图片个数,则返回一个回调函数
            if(this.num>this.arr.length-1){
                this.removeEventListener("load",this.self.loadHandler);//加载完成之后删除事件,之后再修改src不会调用事件
                
                if(this.callback){//如果传入了回调函数
                    this.callback(this.resultArr.slice());//复制一个resultArr返回,原本的resultArr清空,释放内存
                }else{//如果没有传入回调函数,则创建一个自定义事件,拋发出去,
                    var evt=new Event("Load_image_Finish");
                    evt.resultArr=this.resultArr;
                    document.dispatchEvent(evt);
                }
                this.resultArr=null;
                this.self=null;
                this.callback=null;
                this.arr=null;
                return;
            }
            this.src=this.arr[this.num];//把每一个复制的图片设置src属性,调用预加载事件,继续复制下一个图片对象
        }
    }
})();
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="./js/Utils.js"></script>
</head>
<body>
    <script>
        var arr=[];
        for(var i=0;i<80;i++){
            arr.push(i+"-.jpg");
        }
        // 函数的参数
        // 必须填写的写在前面,不是必须填写的写在后面
        document.addEventListener("Load_image_Finish",finishImage)//事件抛发的好处:不管有没有加事件侦听都不会报错
        Utils.loadImage(arr,finishImage,"./img/");

       /*  function finishImage(arr){//回调函数必须具有依懒性,如果没有传入finishImage则会报错
            // console.log(arr)
            arr.forEach(function(item){
                document.body.appendChild(item)
            })
        */ 
        }
    </script>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡萝卜大王驾到通通闪开

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值