Cómo ocultar silenciosamente el icono "Imagen no encontrada" cuando no se encuentra la imagen de origen src


¿Sabes cómo ocultar el icono clásico "Imagen no encontrada" de una página HTML renderizada cuando no se encuentra un archivo de imagen?

¿Algún método de trabajo usando JavaScript/jQuery/CSS?

Author: systempuntoout, 2010-07-13

7 answers

Puede usar el evento onerror en JavaScript para actuar cuando una imagen no se carga:

var img = document.getElementById("myImg");
img.onerror = function () { 
    this.style.display = "none";
}

En jQuery (desde que preguntaste):

$("#myImg").error(function () { 
    $(this).hide(); 
});

O para todas las imágenes:

$("img").error(function () { 
    $(this).hide();
    // or $(this).css({visibility:"hidden"}); 
});

Debe usar visibility: hidden en lugar de .hide() si ocultar las imágenes puede cambiar el diseño. Muchos sitios en la web usan una imagen predeterminada "sin imagen" en su lugar, apuntando el atributo src a esa imagen cuando la ubicación de la imagen especificada no está disponible.

 93
Author: Andy E,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-13 10:23:05
<img onerror='this.style.display = "none"'>
 105
Author: Gary Willoughby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-13 10:12:58

Haciendo una investigación rápida sobre la respuesta de Andy E, no es posible live() vincular error.

// won't work (chrome 5)
$('img').live('error', function(){
     $(this).css('visibility', 'hidden');
});

Así que tienes que ir como

$('<img/>', {
  src:    'http://www.notarget.com/fake.jpg',
  error:  function(e){
    $(this).css('visibility', 'hidden');
  }
}).appendTo(document.body);

Vinculando directamente el error event handler al crear un nuevo elemento.

 4
Author: jAndy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-13 10:20:33

Puede que sea un poco tarde para responder, pero aquí está mi intento. Cuando me enfrenté al mismo problema, lo arreglé usando un div del tamaño de la imagen y configurando background-image a este div. Si la imagen no se encuentra, el div se hace transparente, por lo que todo se hace silenciosamente sin código java-script.

 4
Author: Adway Lele,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-14 21:39:16

Para ocultar cada error de imagen, simplemente agregue este JavaScript en la parte inferior de su página (justo antes de la etiqueta de cuerpo de cierre):

(function() {
    var allimgs = document.images;
    for (var i = 0; i < allimgs.length; i++) {
        allimgs[i].onerror = function() {
            this.style.visibility = "hidden"; // Other elements aren't affected. 
        }
    }
})();
 4
Author: Q_Mlilo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-26 01:07:28

He modificado ligeramente la solución sugerida por Gary Willoughby, porque muestra brevemente la imagen rota. Mi solución:

    <img src="..." style="display: none" onload="this.style.display=''">

En mi solución, la imagen se oculta inicialmente y solo se muestra cuando se carga correctamente. Tiene una desventaja: los usuarios no verán imágenes a medio cargar. Y si el usuario ha desactivado JS entonces nunca verá ninguna imagen

 4
Author: Sash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-11 09:16:39

He encontrado un método ingenioso para hacer exactamente esto, mientras que sigue siendo funcional cuando se utiliza la directiva ng-src en Angular.js y similares...

<img
  ng-src="{{myCtrl.myImageUrlThatWillDynamicallyChange}}" 
  onerror="this.src='data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=='"
  />

Es básicamente un GIF transparente más corto (como se ve http://proger.i-forge.net/%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80/[20121112]%20The%20smallest%20transparent%20pixel.html )

Por supuesto, este gif podría mantenerse dentro de alguna variable global para que no estropee las plantillas.

<script>
  window.fallbackGif = "..."
</script>

Y use

<img
  ng-src="{{myCtrl.myImageUrlThatWillDynamicallyChange}}" 
  onerror="this.src=fallbackGif"
  />

Etc.

 3
Author: Jacek Głodek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-15 14:15:33