Tengo una página web que incluye un montón de imágenes. A veces la imagen no está disponible, por lo que se muestra una imagen rota en el navegador del cliente.
¿Cómo uso jQuery para obtener el conjunto de imágenes, filtrarlo a imágenes rotas y luego reemplazar el src?
Pensé que sería más fácil hacer esto con jQuery, pero resultó mucho más fácil usar una solución de JavaScript pura, es decir, la que proporcionó Prestaul.
javascript
jquery
html
brokenimage
Dan Lord
fuente
fuente
Yo uso el
error
controlador incorporado :Editar: El
error()
método está en desuso en jquery 1.8 y superior. En su lugar, debe usar.on("error")
en su lugar:fuente
En caso de que alguien como yo intente adjuntar el
error
evento a unaimg
etiqueta HTML dinámica , me gustaría señalar que hay un problema:Aparentemente,
img
los eventos de error no aparecen en la mayoría de los navegadores, al contrario de lo que dice el estándar .Entonces, algo como lo siguiente no funcionará :
Espero que esto sea útil para alguien más. Desearía haber visto esto aquí en este hilo. Pero no lo hice. Entonces, lo estoy agregando
fuente
Aquí hay una solución independiente:
fuente
$.browser
ha sido desaprobado y eliminado ahora, use la detección de funciones en su lugar (se vuelve más complicado en este caso).204 No Content
, sería una imagen rota.Creo que esto es lo que buscas : jQuery.Preload
Aquí está el código de ejemplo de la demostración, especifica la carga y las imágenes no encontradas y ya está todo listo:
fuente
Fuente: http://www.developria.com/2009/03/jquery-quickie---broken-images.html
fuente
Si bien el OP estaba buscando reemplazar el SRC, estoy seguro de que muchas personas que respondieron a esta pregunta solo desean ocultar la imagen rota, en cuyo caso esta solución simple funcionó muy bien para mí.
Usando JavaScript en línea:
Usando JavaScript externo:
Usando JavaScript externo moderno:
Consulte el soporte del navegador para NoteList.forEach y las funciones de flecha .
fuente
Aquí hay una manera rápida y sucia de reemplazar todas las imágenes rotas, y no hay necesidad de cambiar el código HTML;)
ejemplo de codepen
fuente
No pude encontrar un script que se adaptara a mis necesidades, por lo que hice una función recursiva para verificar si hay imágenes rotas e intentar volver a cargarlas cada cuatro segundos hasta que se arreglen.
Lo limité a 10 intentos como si no estuviera cargado para entonces, la imagen podría no estar presente en el servidor y la función entraría en un bucle infinito. Aunque todavía estoy probando. Siéntase libre de modificarlo :)
fuente
Esta es una técnica horrible, pero está prácticamente garantizada:
fuente
Puede usar la propia búsqueda de GitHub para esto:
Frontend: https://github.com/github/fetch
o para Backend, una versión de Node.js: https://github.com/bitinn/node-fetch
Editar: este método reemplazará a XHR y supuestamente ya ha estado en Chrome. Para cualquiera que lea esto en el futuro, es posible que no necesite la biblioteca mencionada incluida.
fuente
Este es JavaScript, debe ser compatible con varios navegadores y se entrega sin el marcado feo
onerror=""
:CODEPEN:
fuente
while (i--)
Mejor llamada usando
Porque el uso
document.ready
no necesariamente implica que las imágenes se carguen, solo el HTML. Por lo tanto, no hay necesidad de una llamada retrasada.fuente
Variante CoffeeScript :
Lo solucioné para solucionar un problema con Turbolinks que hace que el método .error () aparezca en Firefox a veces a pesar de que la imagen está realmente allí.
fuente
Al usar la respuesta de Prestaul , agregué algunas comprobaciones y prefiero usar la forma jQuery.
fuente
Si ha insertado su
img
coninnerHTML
, como:,$("div").innerHTML = <img src="wrong-uri">
puede cargar otra imagen si no funciona, por ejemplo, esto:¿Por qué es
javascript: _
necesario? Debido a que las secuencias de comandos inyectadas en el DOM mediante etiquetas de secuencia de comandosinnerHTML
no se ejecutan en el momento en que se inyectan, debe ser explícito.fuente
Encontré esta publicación mientras miraba esta otra publicación SO . A continuación hay una copia de la respuesta que di allí.
Sé que este es un hilo viejo, pero React se ha vuelto popular y, tal vez, alguien que usa React vendrá aquí buscando una respuesta al mismo problema.
Entonces, si está usando React, puede hacer algo como lo siguiente, que fue una respuesta original proporcionada por Ben Alpert del equipo React aquí
fuente
Creé un violín para reemplazar la imagen rota usando el evento "onerror". Esto puede ayudarte.
fuente
Aquí hay un ejemplo usando el objeto de imagen HTML5 envuelto por JQuery. Llame a la función de carga para la URL de la imagen principal y si esa carga causa un error, reemplace el atributo src de la imagen con una URL de respaldo.
fuente
JS puro. Mi tarea era: si la imagen 'bl-once.png' está vacía -> inserte la primera imagen (que no tiene estado 404) de la lista de matriz (en el directorio actual):
Tal vez necesita ser mejorado, pero:
Por lo tanto, insertará el correcto 'needed.png' en mi src o 'no-image.png' desde el directorio actual.
fuente
No estoy seguro de si hay una mejor manera, pero puedo pensar en un truco para obtenerlo: podría publicar Ajax en la URL de img y analizar la respuesta para ver si la imagen realmente regresó. Si volvió como un 404 o algo así, cambie el img. Aunque espero que esto sea bastante lento.
fuente
Resolví mi problema con estas dos funciones simples:
fuente
jQuery 1.8
jQuery 3
referencia
fuente
Creo que tengo una forma más elegante con la delegación de eventos y captura de eventos en
window
'serror
incluso cuando la imagen de copia de seguridad no se pueden cargar.La cuestión es :
Ponga el código en
head
y ejecutado como el primer script en línea. Entonces, escuchará los errores que suceden después del guión.Use la captura de eventos para detectar los errores, especialmente para aquellos eventos que no burbujean.
Utilice la delegación de eventos que evita eventos vinculantes en cada imagen.
Otorgue
img
un atributo al elemento de error después de otorgarles unbackup.png
para evitar la desaparición delbackup.png
bucle infinito y posterior como se muestra a continuación:img error-> backup.png-> error-> backup.png-> error -> ,,,,,
fuente
let isImgErrorHandled = target.src === 'backup.png';
ya que simplifica un poco.target.src='backup.png'
pero la próxima vezconsole.log(target.src)
puede no serbackup.png
Puede pasar una ruta de marcador de posición y acceder a ella todas las propiedades del objeto de imagen fallido a través de
$*
:http://jsfiddle.net/ARTsinn/Cu4Zn/
fuente
Esto me ha estado frustrando durante años. Mi corrección de CSS establece una imagen de fondo en el
img
. Cuando una imagen dinámicasrc
no se carga en primer plano, se visualiza un marcador de posición en elimg
bg del 's. Esto funciona si las imágenes tienen un tamaño predeterminado (por ejemploheight
,min-height
,width
y / omin-width
).Verá el icono de imagen rota, pero es una mejora. Probado hasta IE9 con éxito. iOS Safari y Chrome ni siquiera muestran un ícono roto.
Agregue una pequeña animación para dar
src
tiempo a cargar sin un parpadeo de fondo. Chrome se desvanece en el fondo sin problemas, pero Safari de escritorio no.fuente
Si la imagen no se puede cargar (por ejemplo, porque no está presente en la URL suministrada), la URL de la imagen se cambiará a predeterminada,
Para más información sobre .error ()
fuente
Tengo el mismo problema. Este código funciona bien en mi caso.
fuente
A veces, utilizar el
error
evento no es factible, por ejemplo, porque está intentando hacer algo en una página que ya está cargada, como cuando ejecuta código a través de la consola, un marcador o un script cargado de forma asincrónica. En ese caso, verificar esoimg.naturalWidth
yimg.naturalHeight
son 0 parece ser el truco.Por ejemplo, aquí hay un fragmento para volver a cargar todas las imágenes rotas desde la consola:
fuente
Encontré que esto funciona mejor, si alguna imagen no se carga la primera vez, se elimina completamente del DOM. La ejecución
console.clear()
mantiene limpia la ventana de la consola, ya que los errores 404 no se pueden omitir con los bloques try / catch.fuente