Я пишу веб-приложение, которое включает непрерывный цикл создания (и удаление) достаточное количество изображений на веб-странице. Каждое изображение динамично сгенерировано сервером.
var img = document.createElement("img");
img.src = "http://mydomain.com/myImageServer?param=blah";
В определенных случаях некоторые из этих изображений переживают их полноценность, прежде чем они закончили загружать. В той точке я удаляю их из DOM.
Проблема состоит в том, что браузер продолжает загружать те изображения даже после того, как они были удалены из DOM. Это создает узкое место, так как у меня есть новые изображения, ожидающие, чтобы быть загруженным, но они должны ожидать старых ненужных изображений, чтобы закончить загружать сначала.
Я хотел бы прервать те ненужные загрузки изображения. Очевидное решение, кажется, чтобы запросить данные двухуровневого изображения через Ajax (так как запросы Ajax могут быть прерваны), и установите img.src, после того как загрузка завершена:
// Code sample uses jQuery, but jQuery is not a necessity
var img = document.createElement("img");
var xhr = $.ajax({
url: "http://mydomain.com/myImageServer?param=blah",
context: img,
success: ImageLoadedCallback
});
function ImageLoadedCallback(data)
{
this.src = data;
}
function DoSomethingElse()
{
if (condition)
xhr.abort();
}
Но проблема состоит в том, что эта строка не прокладывает себе путь, я надеялся:
this.src = data;
Я искал высоко и низко. Там никакой путь не состоит в том, чтобы установить источник изображения на данные двухуровневого изображения, отправленные через Ajax?
Для этого вам нужно кодировать base64 данные
в data:
URI . Но это не будет работать в IE6-7, и существуют ограничения на количество данных, которые вы можете туда поместить, особенно в IE8. Возможно, стоит провести оптимизацию для браузеров, где она поддерживается, но я бы не стал на нее полагаться.
Другой возможный подход - использовать XMLHttpRequest
для предварительной загрузки изображения, затем просто отбросить ответ и установить src
нового Image
, чтобы он указывал на тот же адрес. Изображение должно быть загружено из кеша браузера. Однако в случае, когда вы генерируете изображения динамически, вам нужно будет обратить внимание на заголовки кеширования, чтобы гарантировать, что ответ кэшируется.
У вас должна быть возможность использовать URI данных , аналогично решению , которое я определил в предыдущем вопросе. Обратите внимание, что это не будет работать со старыми браузерами.
Попробуйте, например,
this.src = "data: image / png; base64, XXX"
... где XXX
- ваши двоичные данные в кодировке base64. При необходимости измените тип содержимого. Однако я бы не был оптимистично настроен по поводу широкой поддержки этого браузера в браузерах.