11

简而言之,我有一个非常大的照片库,并且我正在尝试在第一页加载时尽可能多地缓存缩略图。可能有 1000 多个缩略图。

第一个问题——尝试预加载/缓存这么多是愚蠢的吗?

第二个问题——当preload()函数触发时,整个浏览器停止响应一到两分钟。此时回调触发,因此预加载完成。有没有办法在尝试加载这么多对象时完成不妨碍用户体验/速度的“智能预加载”?

$.preLoadImages函数取自这里:http ://binarykitten.me.uk/dev/jq-plugins/107-jquery-image-preloader-plus-callbacks.html

这是我实施它的方式:

$(document).ready(function() {
    setTimeout("preload()", 5000);
});
function preload() {
    var images = ['image1.jpg', ... 'image1000.jpg'];
    $.preLoadImages(images, function() { alert('done'); });
}

1000张图片很多。我要求太多了吗?

4

2 回答 2

6

查看该预加载脚本后,该脚本似乎不会等待一个图像加载,然后再继续下一个。我相信这就是导致您的浏览器挂起的原因 - 您实际上是在告诉浏览器同时加载一百张图片。

更好的方法是使用递归函数仅在第一个图像完成后才开始加载下一个图像。这是我放在一起的一个简单示例。

编辑:这会导致堆栈溢出错误,请参阅下面的新版本。

var preLoadImages = function(imageList, callback) {
    var count = 0;
    var loadNext = function(){
        var pic = new Image();
        pic.onload = function(){
            count++;
            if(count >= imageList.length){
                callback();
            }
            else{
                loadNext();
            }
        }
        pic.src = imageList[count];
    }
    loadNext();
};

$(document).ready(function(){
    var files = ['file1,jpg', 'file2.jpg'];
    preLoadImages(files, function(){ alert("Done!"); });
});

同样,这里重要的是确保您一次只强制浏览器下载一个图像。除此之外,您可能会在浏览器全部完成之前锁定浏览器。

--

编辑:新版本没有递归。我用 1000 多个项目数组测试了这个,没有遇到任何错误。我的想法是用间隔和布尔值替换递归;每 50 毫秒,我们轮询函数并询问“有什么加载吗?” 如果答案是否定的,我们将继续排队下一张图片。这一遍又一遍地重复,直到全部完成。

var preLoadImages = function(imageList, callback) {
    var count = 0;
    var loading = false;
    var loadNext = function(){
        if(!loading){
            loading = true;
            count++;
            pic = new Image();
            pic.onload = function(){
                loading = false;
                if(count >= imageList.length-1){
                        clearInterval(loadInterval);
                        callback();
                }
            }
            pic.src = imageList[count];
        }
    }
    var loadInterval = window.setInterval(loadNext, 50);
};

I'm still curious how this will do, performance wise, on a full webpage with lots of other stuff going on. Let us know how it goes.

于 2010-06-15T03:56:00.840 回答
0

这是一个有趣的性能问题。全部预加载后,它在 Firebug 或 Chrome 开发者工具中的表现如何?这让我想到的是,这将是延迟加载插件的一个很好的用途。

Lazy loader 是一个用 JavaScript 编写的 jQuery 插件。它延迟了(长)网页中图像的加载。在用户滚动到它们之前,不会加载视口之外的图像(网页的可见部分)。这与图像预加载相反。

于 2010-06-15T03:53:58.207 回答