Я ищу быстрый и простой способ предварительной загрузки изображений с помощью JavaScript. Я использую jQuery, если это важно.
Я видел это здесь ( http: //nettuts.com ... ):
function complexLoad(config, fileNames) {
for (var x = 0; x < fileNames.length; x++) {
$("<img>").attr({
id: fileNames[x],
src: config.imgDir + fileNames[x] + config.imgFormat,
title: "The " + fileNames[x] + " nebula"
}).appendTo("#" + config.imgContainer).css({ display: "none" });
}
};
Но это выглядит немного чрезмерно для того, что я хочу!
Я знаю, что есть плагины jQuery, которые делают это, но все они кажутся немного большими (по размеру); Мне просто нужен быстрый, простой и короткий способ предварительной загрузки изображений!
$.each(arguments,function(){(new Image).src=this});
Ответы:
Быстро и просто:
Или, если вы хотите плагин jQuery:
источник
$('<img />')
что просто создает элемент изображения в памяти (см. Ссылку ). Похоже,'$('<img src="' + this + '" />')
что на самом деле создаст элемент в скрытом DIV, потому что это более «сложный». Однако я не думаю, что это необходимо для большинства браузеров.$.preload(['img1.jpg', 'img2.jpg'])
?$(window).load(function(){/*preload here*/});
потому что таким образом все изображения в документе загружаются первыми, скорее всего, они нужны в первую очередь.load
событие перед установкой, наsrc
случай, если изображение завершит загрузку до того, как будет установлено событие загрузки?$('<img/>').load(function() { /* it's loaded! */ }).attr('src', this);
Вот измененная версия первого ответа, которая фактически загружает изображения в DOM и скрывает его по умолчанию.
источник
hide()
более кратко чемcss('display', 'none')
.Использовать объект JavaScript Image .
Эта функция позволяет вызвать обратный вызов при загрузке всех изображений. Однако обратите внимание, что он никогда не будет вызывать обратный вызов, если хотя бы один ресурс не загружен. Это может быть легко исправлено путем реализации
onerror
обратного вызова и увеличенияloaded
значения или обработки ошибки.источник
onload
событие, даже если изображение кэшируется? (Потомуimg.onload
что объявляется первым). Это то, что показали мои тесты.JP, После проверки вашего решения, у меня все еще были проблемы в Firefox, когда он не загружал изображения до перехода к загрузке страницы. Я обнаружил это, поместив некоторые
sleep(5)
в свой серверный скрипт. Я реализовал следующее решение на основе вашего, которое, кажется, решает эту проблему.По сути, я добавил обратный вызов в ваш плагин предварительной загрузки jQuery, чтобы он вызывался после правильной загрузки всех изображений.
Из интереса, в моем контексте, я использую это следующим образом:
Надеюсь, это поможет тому, кто заходит на эту страницу из Google (как и я), в поисках решения для предварительной загрузки изображений при вызовах Ajax.
источник
checklist = this.length
И в функции onload:checklist--
Тогда:if (checklist == 0) callback();
.attr({ src: this }).load(function() {...})
В.load(function() {...}).attr({ src: this })
противном случае у вас будут проблемы с кэшированием.Этот однострочный код jQuery создает (и загружает) элемент DOM img, не показывая его:
источник
Использование довольно просто:
http://jsfiddle.net/yckart/ACbTK/
источник
У меня есть небольшой плагин, который обрабатывает это.
Он называется waitForImages и может обрабатывать
img
элементы или любые элементы со ссылкой на изображение в CSS, напримерdiv { background: url(img.png) }
.Если вы просто хотите загрузить все изображения, включая те, на которые есть ссылки в CSS, вот как вы это сделаете :)
источник
:visible
в пользовательский селектор.load
событие, когда применяется к изображениям: «не работает согласованно и надежно кросс-браузер». Как плагину удалось обойти это?Вы можете загрузить изображения в ваш HTML где-нибудь с помощью
display:none;
правила CSS , а затем показать их, когда вы хотите с JS или JQueryне используйте функции js или jquery для предварительной загрузки - это просто правило css против множества строк j, которые нужно выполнить
пример: HTML
Css:
JQuery:
Предварительная загрузка изображений с помощью jquery / javascript не годится, поскольку загрузка изображений на странице занимает несколько миллисекунд + у вас есть миллисекунды для синтаксического анализа и выполнения сценария, особенно если это большие изображения, поэтому скрытие их в hml лучше также для производительности, потому что изображение действительно предварительно загружено, не будучи видимым, пока вы не покажете это!
источник
этот jquery imageLoader плагин всего 1.39kb
Применение:
Существуют также другие варианты, например, хотите ли вы загружать изображения синхронно или асинхронно, а также полное событие для каждого отдельного изображения.
источник
allcomplete
обратный вызов выполняется после того, как DOM будет готов. Есть довольно хороший шанс, что изображения завершат загрузку после того, как DOM будет готов, но нет никаких оснований предполагать. Я не знаю, почему вы думаете, что обратные вызовы магические и выполняются после того, как DOM будет готов ... вы можете объяснить, откуда вы это взяли? То, что изображения загружены, не означает, что DOM готовNB to use this as an image preloader simply put your $(document).ready(function(){}); into your 'allcomplete' event : > simples!
... он прямо рекомендует то, что показывает этот ответ.Быстрый, без плагинов способ предварительно загрузить изображения в jQuery и получить функцию обратного вызова состоит в том, чтобы создавать несколько
img
тегов одновременно и подсчитывать ответы, напримерОбратите внимание, что если вы хотите поддерживать IE7, вам нужно использовать эту немного менее симпатичную версию (которая также работает в других браузерах):
источник
Спасибо за это! Я хотел бы добавить небольшой риф к ответу JP - я не знаю, поможет ли это кому-нибудь, но таким образом вам не нужно создавать массив изображений, и вы можете предварительно загрузить все свои большие изображения, если вы правильно назовите большие пальцы. Это удобно, потому что у меня есть кто-то, кто пишет все страницы в html, и это гарантирует им на один шаг меньше - устранение необходимости создавать массив изображений и еще один шаг, когда все может быть испорчено.
По сути, для каждого изображения на странице он получает src каждого изображения, если он соответствует определенным критериям (большой палец или изображение домашней страницы), он меняет имя (базовая строка заменяет в src изображения), затем загружает изображения ,
В моем случае страница была полна изображений большого пальца, все названы как image_th.jpg, а все соответствующие большие изображения названы image_lg.jpg. Большой палец просто заменяет _th.jpg на _lg.jpg, а затем предварительно загружает все большие изображения.
Надеюсь, это кому-нибудь поможет.
источник
источник
Я использую следующий код:
источник
Я бы использовал файл Manifest, чтобы сообщить (современным) веб-браузерам, чтобы они также загружали все соответствующие изображения и кэшировали их. Используйте Grunt и grunt-manifest, чтобы сделать это автоматически, и больше никогда не беспокоиться о скриптах предварительной загрузки, обесценивателях кэша, CDN и т. Д.
https://github.com/gunta/grunt-manifest
источник
Это работает для меня даже в IE9:
источник
Я хотел сделать это с помощью пользовательского оверлея Google Maps API. Их пример кода просто использует JS для вставки элементов IMG, и поле заполнителя изображения отображается до тех пор, пока изображение не будет загружено. Я нашел ответ, который работал для меня: https://stackoverflow.com/a/10863680/2095698 .
Это предварительно загружает изображение, как предлагалось ранее, а затем использует обработчик для добавления объекта img после загрузки URL-адреса img. Документация jQuery предупреждает, что кэшированные изображения плохо работают с этим кодом события / обработчика, но он работает для меня в FireFox и Chrome, и мне не нужно беспокоиться об IE.
источник
.attr('src',value)
не.attr('src',this)
просто чтобы указать на это :)
источник
this
внутри обратного вызова, которому передается,$.each
присваивается значению, которое повторяется.$("div").each(function(i, el){ console.log(el == this);});
генерирует всеtrue
s; Итерация по массиву, кажется, ведет себя по-другому.5 строк в coffeescript
источник
Для тех, кто немного знает ActionScript, вы можете с минимальными усилиями проверить flash player и сделать предварительный загрузчик flash, который вы также можете экспортировать в html5 / Javascript / Jquery. Чтобы использовать, если flash player не обнаружен, посмотрите примеры того, как сделать это с ролью youtube обратно в html5 player :) И создайте свой собственный. У меня нет подробностей, потому что я еще не начал, если я не забыл, я опубликую его позже и попробую какой-то странный код Jquery для моего.
источник