Браузер предварительной загрузки изображений JQuery / остановки кэша - PullRequest
11 голосов
/ 15 июня 2010

Короче говоря, у меня очень большая фотогалерея, и я пытаюсь кэшировать как можно больше миниатюр изображений при первой загрузке страницы.Может быть более 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 изображений это много.Я слишком много спрашиваю?

Ответы [ 2 ]

6 голосов
/ 15 июня 2010

После просмотра этого сценария предварительной загрузки выясняется, что сценарий не ожидает загрузки одного изображения, прежде чем перейти к следующему. Я полагаю, что именно это заставляет ваш браузер зависать - вы по сути говорите браузеру загружать сотню изображений одновременно.

Лучшим способом было бы использовать рекурсивную функцию, чтобы начать загрузку следующего изображения только после того, как первое будет сделано. Вот простой пример, который я собрал.

Редактировать: это вызывает ошибки переполнения стека, см. Новую версию ниже.

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);
};

Мне по-прежнему любопытно, как это будет происходить с точки зрения производительности на полной веб-странице, где происходит множество других вещей. Дайте нам знать, как это происходит.

0 голосов
/ 15 июня 2010

Это интересный вопрос производительности.Как это работает в Firebug или Chrome Developer Tools, когда вы предварительно загружаете все это?Это заставляет меня задуматься о том, что было бы неплохо использовать Lazy Load Plugin .

Lazy loader - это плагин jQuery, написанный на JavaScript.Это задерживает загрузку изображений в (длинные) веб-страницы.Изображения вне области просмотра (видимая часть веб-страницы) не будут загружаться до того, как пользователь прокрутит их.Это противоположно предварительной загрузке изображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...