Как скрыть сломанные изображения в IE с помощью jQuery?

Я пробовал этот код, скопированный с сайта jQuery, но он не работает в IE7/IE8, но работает в других браузерах. Что не так с этим кодом, это с сайта jQuery (http://api.jquery.com/error/). Я использую jQuery версии 1.4.4.

$(document).ready(function(){ 
  $("img").error(function(){
    $(this).hide();     
  });    
});

Ответ 1

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

Единственный способ, с помощью которого я могу обходить это, - перезагрузить изображение, таким образом "заставить" событие запускать:

$(document).ready(function(){ 
    $("img").each(function(index) {
        $(this).error(function() {
            $(this).hide();     
        });
        $(this).attr("src", $(this).attr("src"));
  });    
});

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

Живой тестовый пример (с классными кошками;)) можно найти здесь: http://jsfiddle.net/yahavbr/QvnBC/1/

Ответ 2

Использование вышеуказанного решения по-прежнему будет приводить к кратковременному появлению значка "сломанного изображения", поскольку существует латентность между error() и hide().

Я использовал jQuery imagesloaded plugin, который позволяет обратный вызов при успешном загрузке изображения. Сначала я установил изображение на visibility:hidden. Затем я устанавливаю его в visible, когда он успешно загружается:

$('div.target img').each(function(){
  $(this).imagesLoaded(function(){
    $(this).css('visibility','visible');
  })
})

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

Ответ 3

В моем случае в IE8 мое замещающее изображение все еще не загружалось. Следующий код исправил это для меня. Возможно, вам придется поиграть с задержкой таймаута, чтобы узнать, что лучше всего работает.

setTimeout(function() {
    $("img").each(function () {
        $(this).error(function () {
            $(this).attr("src", "../imageupload/image-failed.png");
        });
        $(this).attr("src", $(this).attr("src"));
    });
}, 100);