Предварительная загрузка изображений в Javascript

Я создал простую программу просмотра фотогалереи, и я хотел бы предварительно загрузить изображения в фоновом режиме, а затем запустить функцию, когда они будут готовы.

У меня вопрос, как мне это сделать?


person guyzyl    schedule 23.05.2012    source источник
comment
Пожалуйста, не делайте ссылки на ваш местный сайт. через годы он может исчезнуть ... покажите, пожалуйста, код, который вы использовали ...   -  person Naftali aka Neal    schedule 23.05.2012
comment
Вот ответ, который я сделал по аналогичной теме   -  person Joseph    schedule 23.05.2012
comment
возможный дубликат Ожидание загрузки изображения в Javascript   -  person Matt Ball    schedule 23.05.2012
comment
вы можете найти ответ на странице Предварительная загрузка изображений JavaScript (помечены как повторяющиеся)   -  person Bergi    schedule 23.05.2012


Ответы (3)


var image = new Image();
image.src = "http://foo.com/myimage.jpg";

//if you have a div on the page that's waiting for this image...
var div = getElementById("imageWrapperDiv");

//you can set it on the image object as the item to draw into...
image.myDiv = div;

image.onload = function(){
  //do whatever you're going to do to display the image

  //so in this example, because I have set this objects myDiv property to a div on the page
 // I can then just populate that div with an img tag.
 //it's not the most elegant solution, but you get the idea and can improve upon it easily
  this.myDiv.innerHTML = "<img src='" +  this.src  +"'>";
}

Как только изображение загружается, оно находится в кеше браузера, поэтому, если вы используете свойство src, вы можете нарисовать его в любом месте страницы, и оно отобразится мгновенно.

person Yevgeny Simkin    schedule 23.05.2012
comment
это, кажется, решение, которое я ищу! Итак, если я хочу записать изображение после его загрузки, я должен создать функцию записи и использовать image.src в качестве каталога? - person guyzyl; 23.05.2012
comment
image.src - это просто строка. Я отредактирую свой ответ, чтобы показать вам, как на самом деле отображать изображение - person Yevgeny Simkin; 23.05.2012
comment
спасибо за обновление и ответ, сейчас я попытаюсь внедрить его на свой веб-сайт и посмотрю, подойдет ли он мне - person guyzyl; 23.05.2012
comment
имейте в виду, что если вы будете точно следовать этому примеру, вам не нужно делать ничего из этого, пока страница не завершит загрузку, иначе getElementById (imageWrapperDiv) вернет undefined, так как такого элемента нет, пока страница не загрузится (и содержит ‹ div id = imageWrapperDiv ›тег где-нибудь в нем! - person Yevgeny Simkin; 23.05.2012
comment
Я делаю это не так, как вы написали, я использую ваш предыдущий нереализованный пример - person guyzyl; 23.05.2012
comment
УСПЕХ !, это сработало, спасибо за все (теперь у меня есть некоторые проблемы с дизайном, которые мне нужно исправить, но это не имеет значения), так что большое спасибо - person guyzyl; 23.05.2012

Мне нравится этот метод CSS по сравнению с типичной функцией Javascript:

Поместите это в свой файл CSS:

div#preload { display: none; }

Поместите это внизу вашего HTML-документа:

<div id="preload">
   <img src="http://domain.tld/image-01.png" width="1" height="1" alt="Image 01" />
   <img src="http://domain.tld/image-02.png" width="1" height="1" alt="Image 02" />
   <img src="http://domain.tld/image-03.png" width="1" height="1" alt="Image 03" />
</div>

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

http://perishablepress.com/pure-css-better-image-preloading-without-javascript/

person Ross R    schedule 23.05.2012
comment
как узнать, когда загрузка изображений завершена? и в чем преимущество этого метода по сравнению с методом, который я публикую ниже? Обратите внимание, что комментарии в опубликованной вами ссылке говорят то же самое и не рекомендуют использовать этот метод! - person Yevgeny Simkin; 23.05.2012
comment
в дополнение к тому, что сказал доктор Дредел, мне нужно каждый раз загружать другое изображение, поэтому я не собираюсь использовать css, поскольку идентификатор галереи и изображения находятся в javascript - person guyzyl; 23.05.2012
comment
используя мой метод, просто замените строку url, которую вы передаете свойству src, и вы загрузите разные изображения. Очевидно, у вас может быть столько объектов Image на странице, сколько вам нужно. - person Yevgeny Simkin; 23.05.2012
comment
Действительно ли браузеры загружают невидимые изображения? - person Bergi; 23.05.2012
comment
@Bergi, браузерам все равно, видны они или нет, и на самом деле браузер не заинтересован даже в том, чтобы беспокоиться об их видимости, пока не появятся фактические байтовые данные для отображения, так что да, они загрузят все, что вы им скажете src есть, а затем посмотрите, что делать дальше. - person Yevgeny Simkin; 23.05.2012
comment
Очевидно, это только для статических изображений. Поскольку страница загружается с головы вниз, вам нужно разместить погружение до того места, где они используются. Я обычно использую это слово в боковой демонстрации галереи изображений, первое изображение загружается и к моменту переключения пользователя или времени загрузки изображения - person Ross R; 23.05.2012
comment
@Ross R, а в чем смысл? Что заставляет предварительно загружать div на самом деле, когда изображения заканчивают загрузку? Я не понимаю, какую проблему это решает. - person Yevgeny Simkin; 23.05.2012

Для предварительной загрузки изображения используйте тег <link> и добавьте preload к атрибуту rel:

<link rel=preload href=path/to/the/image.jpg as=image>

В качестве альтернативы в Javascript:

var preImg = document.createElement('link')
preImg.href = 'path/to/image.jpg'
preImg.rel = 'preload'
preImg.as = 'image'
document.head.appendChild(preImg)

Значение preload атрибута rel элемента позволяет вам писать декларативные запросы выборки в вашем HTML, указывая ресурсы, которые потребуются вашим страницам очень скоро после загрузки, поэтому вы хотите начать предварительную загрузку на ранних этапах жизненного цикла загрузки страницы, до того, как браузер Включается основной механизм рендеринга. Это гарантирует, что они станут доступными раньше и с меньшей вероятностью заблокируют первый рендеринг страницы, что приведет к повышению производительности.

Документация: https://developer.mozilla.org/en-US/docs/Web/HTML/Preloading_content

person Thielicious    schedule 27.11.2018