Как я могу возвратить данные двухуровневого изображения из abortable запроса Ajax и установить результат на src изображения HTML/DOM?

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

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?

5
задан Michael 25 February 2010 в 01:32
поделиться

3 ответа

Для этого вам нужно кодировать base64 данные в data: URI . Но это не будет работать в IE6-7, и существуют ограничения на количество данных, которые вы можете туда поместить, особенно в IE8. Возможно, стоит провести оптимизацию для браузеров, где она поддерживается, но я бы не стал на нее полагаться.

Другой возможный подход - использовать XMLHttpRequest для предварительной загрузки изображения, затем просто отбросить ответ и установить src нового Image , чтобы он указывал на тот же адрес. Изображение должно быть загружено из кеша браузера. Однако в случае, когда вы генерируете изображения динамически, вам нужно будет обратить внимание на заголовки кеширования, чтобы гарантировать, что ответ кэшируется.

3
ответ дан 14 December 2019 в 19:10
поделиться

У вас должна быть возможность использовать URI данных , аналогично решению , которое я определил в предыдущем вопросе. Обратите внимание, что это не будет работать со старыми браузерами.

0
ответ дан 14 December 2019 в 19:10
поделиться

Попробуйте, например,

this.src = "data: image / png; base64, XXX"

... где XXX - ваши двоичные данные в кодировке base64. При необходимости измените тип содержимого. Однако я бы не был оптимистично настроен по поводу широкой поддержки этого браузера в браузерах.

2
ответ дан 14 December 2019 в 19:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: