обнаружение загрузки img в javascript

У меня есть функция, в которой я получаю значение img src в качестве параметра, и я хочу проверить, загружается ли это изображение с ошибкой 200 ok или 404/какой-либо другой ошибкой. Если он получает 200 ok, то я хочу внедрить тег img с этим src в DOM (я полагаю, что во время проверки он также загружается в кеш браузера, а внедрение этого тега img в DOM загружает его из кеша) . Я попытался с помощью простого фрагмента кода следующим образом:

function checkImage(src)
{
   var img = new Image(),
   tag = '<img src="'+src+'" />',
   alt = '<span>sorry,image broken</span>';
   img.onload = function(){
       $('.some-container').html(tag);
   };
   img.onerror = function(){
      $('.some-container').html(alt);
   };
   img.src = src;
}

Он отлично работал в Chrome, но пошел в хаос в Firefox и т. Д. (Оба они запускают только событие ошибки, независимо от того, загружается ли изображение нормально или сломалось). Вместо использования onload и onerror я попробовал использовать jquery, например:

$(img).load(...).error(...).attr('src',url);

$(img).on('load',...).on('error',...).attr('src',url);

$('<img />').load(...).error(...).attr('src',url);

$('<img />').on('load',...).on('error',...).attr('src',url);

и даже попробовал плагин jquery.imagesLoaded от desandro(https://github.com/desandro/imagesloaded ) как :

$(img).imagesLoaded().done(...).fail(...);

$(img).imagesLoaded().progress(function(instance,image){
    image.isLoaded?alert('loaded'):alert('broken');
});

$('<img />').imagesLoaded().done(...).fail(...).attr('src',url);

$('<img />').imagesLoaded().progress(function(instance,image){
    image.isLoaded?alert('loaded'):alert('broken');
});

Я также пробовал решения из:

обратный вызов jQuery при загрузке изображения (даже если изображение кэшируется)

https://groups.google.com/forum/#!topic/jquery-dev/7uarey2lDh8

но, как оказалось, работает в хроме, но не в FF или IE, есть ли решение, где я могу проверить изображение, которое присутствует в памяти, но не в «DOM»? Заранее спасибо.


person somedev    schedule 19.08.2013    source источник
comment
после тщательной проверки я обнаружил причину, по которой img.onload не запускался, оказалось, что я неправильно указывал URL-адреса, кроме указанной функции, я извлекал фоновые URL-адреса из DOM, а затем отдавал их эта функция, чтобы проверить, должны ли они быть введены в DOM или нет, оказывается, что FF включает дополнительный набор (двойные кавычки) в bg-url, который я не удалял, и, следовательно, они всегда вызывали событие ошибки . Кажется, что самый простой img.onload, img.onerror работает как положено, спасибо за вашу помощь, ребята :)   -  person somedev    schedule 19.08.2013


Ответы (2)


Вы должны проверить загрузку изображения после установки для него источника.

  var img = new Image();
  //set source to the image
  img.src = "set/image/source/path"

  img.onload = function(){

    //if image load is successful
    //create an jQuery object out of this image
    var jQimage = $(this);
    $('.myContainer').html(jQimage);

  }

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

Таким образом, лучший подход — проверить загрузку с помощью собственного javascript и создать объект jQuery, если необходимо использовать методы jQuery.

person palerdot    schedule 19.08.2013
comment
Почему? img.onload запускается после загрузки img. Если изображение будет загружено из кеша, оно может быть готово до того, как будет определена функция onload, тогда событие вообще не сработает. Установка src после обработчика onload гарантирует, что этого не произойдет. - person Teemu; 19.08.2013
comment
Если изображение уже загружено, вы должны повторно использовать этот объект изображения, поскольку иногда браузеры игнорируют загрузку, если пытаются загрузить то же изображение (то есть с тем же источником). И, что касается вашего подхода, если вы не добавите источник к объекту изображения, то onload не будет вызываться, так как загружать нечего. - person palerdot; 19.08.2013
comment
Я не думаю, что порядок будет иметь какое-либо значение, если это то, о чем вы спрашиваете. Вы можете попробовать. Всякий раз, когда изображение устанавливается в качестве источника, оно извлекает объект изображения и слушает обработчик загрузки (если есть). Позиция определения обработчика загрузки может быть до или после установки источника. Все равно будет называться. - person palerdot; 19.08.2013
comment
Я думал, что то, что сказал @Teemu, верно, но я проверил и обнаружил, что то, что вы сказали, тоже верно, при загрузке изображения оно проверяет, есть ли у него привязанный обработчик для события onload, и вызывает его, если он присутствует, но приходит к тема, так как нет никакой разницы (я тоже попробовал ваш фрагмент), firefox по-прежнему не вызывает событие onload для объектов изображения (которые не являются объектами DOM). - person somedev; 19.08.2013
comment
@palerdot, спасибо, но я уже давал ссылку на те же вопросы и ответы в своем вопросе, я пробовал это решение, как я уже сказал, оно отлично работает в Chrome, но не в FF (в FF он обрабатывает даже изображение, которое имело статус 404 как изображение, которое загрузилось и добавляет его в DOM) - person somedev; 19.08.2013
comment
а также более того, все эти решения, по-видимому, предназначены для изображений, которые уже присутствуют в DOM, поскольку большинство из них используют $(img), но в моем случае я использую только объекты изображения, которые еще не добавлены в DOM. ДОМ явно. - person somedev; 19.08.2013
comment
срабатывает ли img.onerror после добавления источника к объекту изображения? - person palerdot; 19.08.2013
comment
эй, я только что обнаружил застенчивую ошибку, включаю ее в свой первоначальный вопрос в качестве комментария, пожалуйста, найдите время, чтобы прочитать ее :) - person somedev; 19.08.2013

Посмотрите, что w3schools говорит об объекте javascript Image().

http://www.w3schools.com/jsref/dom_obj_image.asp

onabort - Загрузка образа прерывается, W3C YES

onerror - Ошибка при загрузке изображения, W3C YES

onload - загрузка изображения завершена, W3C YES

также полное свойство объекта Image(), определяет, закончил ли браузер загрузку изображения. К сожалению, это конкретное свойство не является W3c

надеюсь, что немного поможет

PS: После небольшого поиска в Google я нашел этот Q/A от переполнения стека.

Кроссбраузерная обработка событий при загрузке изображения

person James Nicholson    schedule 19.08.2013
comment
это полезно, да, я начал ссылаться на это, я считаю, что onabort - это не то событие, которое вызывается в моем случае, поскольку я не меняю src на полпути загружаемого изображения, просто FF и IE, кажется, не вызывать событие onload для объектов изображений, когда они присутствуют в кеше браузера. - person somedev; 19.08.2013
comment
Посмотрите на мой отредактированный ответ, я нашел предыдущие вопросы и ответы из стека :) - person James Nicholson; 19.08.2013
comment
спасибо, Джеймс, но это тоже не сработало, скорее всего, потому, что .load() не работает для изображений, которые уже присутствуют в кеше браузера, то же самое говорится и в документах jquery - api.jquery.com/load-event у него есть свои предостережения, упомянутые в ссылке, которую я предоставил :) - person somedev; 19.08.2013
comment
эй, я только что обнаружил застенчивую ошибку, включаю ее в свой первоначальный вопрос в качестве комментария, пожалуйста, найдите время, чтобы прочитать ее :) - person somedev; 19.08.2013