2010-07-13 19 views
79

¿Sabe cómo ocultar el clásico "Imagen no encontrada" icono de una página HTML procesada cuando no se encuentra un archivo de imagen?Cómo ocultar de forma silenciosa el icono "Imagen no encontrada" cuando no se encuentra la imagen original del src

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

+0

No veo el punto. No se supone que intentes llegar a ningún recurso existente de tu código html. El uso de javascript para ocultar los recursos mal tratados parece ser una solución fea para mí. –

+1

@Kaaviar Te estás perdiendo el punto. Hay muchas imágenes enlazadas aquí en Stack Overflow debido a que las imágenes pueden estar disponibles en el momento de la publicación, pero no están disponibles algunos meses después. Estas imágenes se ocultan silenciosa y suavemente. – systempuntoout

+0

@systempuntoout: las imágenes rotas publicadas en las preguntas muestran el ícono de imagen rota para mí. Acabo de probarlo. –

Respuesta

89

Usted puede utilizar 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 (ya que lo preguntas):

$("#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 está oculto th Las imágenes pueden cambiar el diseño. Muchos sitios en la web utilizan una imagen predeterminada "sin imagen" en su lugar, señalando el atributo src a esa imagen cuando la ubicación de la imagen especificada no está disponible.

+0

es ese crossbrowser? – jAndy

+1

andy: ¿cuál sería la solución "global" para aplicar a TODAS las imágenes? Estoy pensando que sería bastante fácil si todos estuvieran en el mismo div: solo me preguntaron sobre TODAS las imágenes del documento ... –

+0

@jAndy: Estaba bastante seguro de que así es, pero su comentario me hizo volver a verificarlo. Un rápido Google devolvió esta [página w3schools] (http://www.w3schools.com/jsref/event_img_onerror.asp) (lo siento David, si estás leyendo esto) indicando compatibilidad con varios navegadores. –

4

Haciendo una búsqueda rápida en respuesta Andy E 's, no es posible live() unen error.

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

así que hay que ir como

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

directamente la unión del error event handler en la creación de un nuevo elemento.

+2

+1, la razón de esto es que el evento * onerror * DOM no burbujea. * live * y * delegate * funcionan colocando el controlador de eventos más arriba en la jerarquía DOM y capturando el evento a medida que surge. Por supuesto, los desarrolladores de jQuery han solucionado esto para algunos eventos como * focus * y * blur * –

+0

@Andy E: Sí, ya han pensado en eso, podría no ser la peor de las ideas para hacer algo similar para 'error'. Suena como un "lindo tener" para mí. – jAndy

100
<img onerror='this.style.display = "none"'> 
+0

Desafortunadamente no puedo usar esta solución porque el contenido html se descarga desde un sitio web de terceros a través de Json y no puedo editarlo. Gracias de cualquier manera. – systempuntoout

+7

Impresionante, justo lo que necesitaba. ¡Simple y no obstructivo, cabe en una plantilla! – Max

+4

cosa de belleza !!!!!! gracias @gary – malcolmX

4

Para ocultar todos los errores de imagen, basta con añadir este JavaScript en la parte inferior de la página (justo antes de la etiqueta del 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. 
     } 
    } 
})(); 
+0

Este es mi enfoque preferido porque garantiza que los eventos onerror están vinculados antes de que las imágenes tengan errores y no es necesario agregar atributos de error a cada etiqueta de imagen. Asegúrese de poner este código después de todas sus etiquetas de imagen pero antes de cualquier otro javascript que esté en , de lo contrario, el bloqueo de la carga externa de JS puede causar la ejecución después de un error de imagen. – galatians

+0

Este funciona para mí, junto con el consejo de galatianos, es necesario que este JS se ejecute antes de cualquier cosa que pueda retrasarlo. – Adamz

4

Puede ser poco tarde para contestar, pero aquí es mi intento. Cuando se enfrentó al mismo problema que fija mediante el uso de un div del tamaño de la imagen & entorno Imagen de fondo de este div. Si no se encuentra la imagen, el div se vuelve transparente, por lo que su todo hecho en silencio y sin código de Java-Script.

3

he encontrado un método ingenioso para hacer exactamente esto, al tiempo que sigue siendo funcional cuando se utiliza ng-src Directiva en angularjs y como ...

<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 esto gif podría mantenerse dentro de alguna variable global, por lo que no se hace un lío las plantillas.

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

y utilizar

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

etc.

4

He modificado ligeramente 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 está oculta inicialmente y solo se muestra cuando se carga con éxito. Tiene una desventaja: los usuarios no verán imágenes cargadas. Y si el usuario ha desactivado JS, entonces nunca verá ninguna imagen

+1

... ¡y los usuarios no verán nada si javascript está deshabilitado! – yckart

+0

@yckart Bueno, si los usuarios tienen javascript deshabilitado, la mayoría de las aplicaciones web útiles no funcionarán de todos modos ... – awe

+0

'' podría funcionar mejor para los casos de navegador medio cargado y no js? – JoeRocc

Cuestiones relacionadas