图片预加载(自动检测)

加载一个庞大的页面(有很多img)时,往往希望制作一个loading页来提升用户体验。

网上很多js预加载函数并不是那么智能,需要用户自己整理图片列表再传入函数中处理。

于是乎就想写个能自动检测的预加载插件

以下是插件代码:

$.fn.extend({
    /**
     * 图片预加载
     * @param {Function} callback1 : 每个图片加载完成后回调
     * @param {Function} callback2 : 全部加载完成后回调
     */
    imgPreLoader : function(callback1, callback2){
        var imgPreOptions = [],
            imgList = [],
            errorList = [],
            currentNum = 0,
            onChange = ( $.isFunction(callback1) ) ? callback1 : '',
            onComplete = ( $.isFunction(callback2) ) ? callback2 : '',
            self = this;

        var getImages = function(element){
            if($(element).find('*:not(script)').length > 0){
                $(element).find('*:not(script)').each(function(){
                    var url = "";
                    if( $(this).css('background-image') && $(this).css('background-image').indexOf('none') == -1 ) {
                        url = $(this).css('background-image');

                        if(url.indexOf('url') != -1) {
                            var temp = url.match(/url\((.*?)\)/);
                            url = temp[1].replace(/\"/g, '');
                        }
                    } else if ( $(this).get(0).nodeName.toLowerCase() == 'img' && typeof( $(this).attr('src') ) != 'undefined') {
                        url = $(this).attr('src');
                    }

                    if (url.length > 0) {
                        imgList.push(url);
                    }
                });
            }else if($(element).get(0).nodeName.toLowerCase() == 'img' && typeof($(element).attr('src')) != 'undefined'){
                imgList.push($(element).attr('src'));
            }

            loadImgList();            
        }

        var loadImgList= function(){
            for (var i = 0; i < imgList.length; i++) {
                loadImg(imgList[i]);
            }
        }

        var loadImg = function(url){
            var img = new Image();
            $(img)
            .load(function(){
                completeLoading();
            })
            .error(function(){
                errorList.push($(this).attr('src'));
                completeLoading();
            })
            .attr('src',url);
        }

        var completeLoading = function(){
            currentNum++;
            var per = Math.round((currentNum / imgList.length) * 100);        
            if(onChange) onChange(per);
            if(currentNum >= imgList.length && onComplete) {
               onComplete();
            }
        }

        getImages(this);
    
        return this; // 支持链式调用
    }
});

调用方法:

// 调用方法
$('body').imgPreLoader(function(per){
    console.log(per);
},function(){
    console.log('preload completed!');
});

PS:可以根据需求自由选择预加载区域

posted @ 2017-05-10 16:22  BarryChen89  阅读(308)  评论(0编辑  收藏  举报