jQuery实现预加载图片功能的方法-创新互联-成都创新互联网站建设

关于创新互联

多方位宣传企业产品与服务 突出企业形象

公司简介 公司的服务 荣誉资质 新闻动态 联系我们

jQuery实现预加载图片功能的方法-创新互联

这篇文章给大家分享的是有关jQuery实现预加载图片功能的方法的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。

创新互联建站-成都网站建设公司,专注做网站、成都做网站、网站营销推广,国际域名空间,网络空间,网站托管、服务器租用有关企业网站制作方案、改版、费用等问题,请联系创新互联建站

最近要用javascript做一个动画功能,为了确保动画在播放的时候能够顺利和平滑,我需要对所用到的图片素材进行预加载

jQuery实现预加载图片功能的方法

单图片预加载

目前最常见的一种实现方式如下

function preloadImg(url) {
    var img = new Image();
    img.src = url;
    if(img.complete) {
        //接下来可以使用图片了
        //do something here
    }
    else {
        img.onload = function() {
            //接下来可以使用图片了
            //do something here
        };
    }
}

首先实例化一个Image对象赋值给img,然后设置img.src为参数url指定的图片地址,接着判断img的complete属性,如果本地有这张图片的缓存,则该值为true,此时我们可以直接操作这张图片,如果本地没有缓存,则该值为false,此时我们需要监听img的onload事件,把对img的操作放在onload的回调函数里面,经过测试,这种方案基本能够兼容目前所有浏览器

多图片预加载


很多场景下,单图片预加载并不能满足我们的需求,因为像动画这种功能通常都会有很多的图片素材,接下来我们就在原来单图片预加载的基础上来改进我们的函数

function preloadImg(list) {
    var imgs = arguments[1] || [],    //用于存储预加载好的图片资源
        fn = arguments.cal    lee;
    if(list.length == 0) {
        return imgs;
    }
    var img = new Image();
    img.src = list[0];
    if(img.complete) {
        imgs.push(img);
        list.shift();
        fn(list, imgs);
    }
    else {
        img.onload = function() {
            imgs.push(img);
            list.shift();
            fn(list, imgs);
        };
    }
}
var list = [......],    //此处省略一万个字符
    imgs = preloadImg();

因为帧动画可能需要保证每一帧动画所用的图片的顺序,所以我在这段代码中使用递归的方式,在上一张加载完成之后再去加载下一张图片,每加载一张图片,就把这张图片资源存储到imgs数组中,并且把这张图片的地址从地址数组list中去掉,当list中已经没有地址的时候跳出递归,并返回imgs数组

设想很美好,现实很残酷,这段代码有2个不能忍受的问题

首先,我很有可能拿不到最后返回的imgs数组,因为只要有图片在本地没有缓存,imgs的存储操作都会放到onload的回调事件中,而事件监听也属于javascript中异步操作的一种,在绑定完onload事件的回调函数后,preloadImg函数就执行结束了,没有任何返回值,外部imgs变量接收到的值为undefined,只有在所有图片都有本地缓存的情况下,外部imgs变量才能顺利拿到存储了全部预加载图片资源的数组

在加载完一张图片之后才去加载下一张,整个预加载图片的过程所需要的时间相对会比较长,用户体验会降低,而且本来异步操作具体速度快的特性,这样的实现方式等于完全弃置了onload异步的这个特性

多图片预加载(改进版)

这次我们直接把一个空数组作为参数传进函数,图片全部存储到这个数组里面,下面是改进后的函数代码(假设我们可以使用jQuery)

function preloadImg(list,imgs) {
    var def = $.Deferred(),
        len = list.length;
    $(list).each(function(i,e) {
        var img = new Image();
        img.src = e;
        if(img.complete) {
            imgs[i] = img;
            len--;
            if(len == 0) {
                def.resolve();
            }
        }
        else {
            img.onload = (function(j) {
                return function() {
                    imgs[j] = img
                    len--;
                    if(len == 0) {
                        def.resolve();
                    }
                };
            })(i);
            img.onerror = function() {
                len--;
                console.log('fail to load image');
            };
        }
    });
    return def.promise();
}
var list = [......],    //此处省略一万个字符
    imgs = [];
$.when(preloadImg(list, imgs)).done(
    function() {
        //预加载结束
        //do something here
    }
);

在分别给每一个img绑定onload的回调函数时采用了闭包的方式,目的是为了保存住当前的递增变量i,要是不这么做,结果将会是list地址中没有本地缓存的图片都存储到imgs的最后一个元素上

这次每载入一张图片,我们并没有把这张图片的地址从list数组中去掉,这样后续需要使用list数组的数据时就能够顺利获取到

在这次的代码中,我们引入了jQuery的Deferred对象,这样更方便我把握整个预加载图片的过程

感谢各位的阅读!关于jQuery实现预加载图片功能的方法就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到吧!

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


当前题目:jQuery实现预加载图片功能的方法-创新互联
文章地址:http://kswsj.cn/article/ehehh.html

其他资讯