Estoy usando JavaScript con la biblioteca jQuery para manipular miniaturas de imágenes contenidas en una lista desordenada. Cuando se carga la imagen, hace una cosa, cuando se produce un error, hace otra cosa. Estoy usando jQuery load()
y error()
métodos como eventos. Después de estos eventos, verifico el elemento DOM de la imagen para el .complete para asegurarme de que la imagen no esté cargada antes de que jQuery pueda registrar los eventos.
Funciona correctamente, excepto cuando se produce un error antes de que jQuery pueda registrar los eventos. La única solución que se me ocurre es utilizar el onerror
atributo img para almacenar una "bandera" en algún lugar del mundo (o en el nodo en sí) que dice que falló para que jQuery pueda verificar esa "tienda / nodo" al verificar .complete.
¿Alguien tiene una mejor solución?
Editar: puntos principales en negrita y detalles adicionales a continuación: estoy verificando si una imagen está completa (también cargada) DESPUÉS de agregar un evento de carga y error en la imagen. De esa manera, si la imagen se cargó antes de que se registraran los eventos, todavía lo sabré. Si la imagen no se carga después de los eventos, los eventos se encargarán de ella cuando lo haga. El problema con esto es que puedo verificar fácilmente si una imagen ya está cargada, pero no puedo decir si ocurrió un error.
fuente
Respuestas:
Otra opción es activar los eventos
onload
y / oonerror
creando un elemento de imagen en memoria y estableciendo susrc
atributo alsrc
atributo original de la imagen original. Aquí hay un ejemplo de lo que quiero decir:¡Espero que esto ayude!
fuente
.attr
línea después de las líneas.load
y.error
. De lo contrario, corre el riesgo de que la imagen se cargue (o encuentre un error) antes de agregar esas devoluciones de llamada, y no se llamarán..load()
y.error()
métodos son confusas y ahora en desuso, el uso.on()
y el uso de lasload
yerror
como eventos.Verifique las propiedades
complete
ynaturalWidth
, en ese orden.https://stereochro.me/ideas/detecting-broken-images-js
fuente
Según mi comprensión de la Especificación HTML W3C para el
img
elemento , debería poder hacer esto usando una combinación de los atributoscomplete
ynaturalHeight
, de esta manera:De la especificación para el
complete
atributo:Entonces, esencialmente,
complete
devuelve verdadero si la imagen ha terminado de cargarse o no se pudo cargar. Como solo queremos el caso en el que la imagen se cargó correctamente, también debemos verificar elnauturalHeight
atributo:Y
available
se define así:Entonces, si la imagen está "rota" (no se pudo cargar), entonces estará en el estado roto, no en el estado disponible, por
naturalHeight
lo que será 0.Por lo tanto, la comprobación
imgElement.complete && imgElement.naturalHeight !== 0
debería decirnos si la imagen se ha cargado correctamente.Puede leer más sobre esto en la Especificación HTML del W3C para el
img
elemento , o en MDN .fuente
Intenté muchas formas diferentes y esta es la única que funcionó para mí.
También puede agregar una función de devolución de llamada activada una vez que todas las imágenes se cargan en el DOM y están listas. Esto también se aplica a las imágenes agregadas dinámicamente. http://jsfiddle.net/kalmarsh80/nrAPk/
fuente
Utiliza la
imagesLoaded
biblioteca javascript .Se puede usar con Javascript simple y como un complemento jQuery.
caracteristicas:
Recursos
fuente
complete
propiedad no parece ser claramente compatible: no se puede encontrar una fuente confiable de información sobre el soporte del navegador.complete
La propiedad tampoco parece tener una especificación clara: la especificación HTML5 es la única que la menciona y todavía está en una versión borrador al momento de la escritura. Si usanaturalWidth
ynaturalHeight
solo tiene soporte para IE9 +, por lo que si lo usa para averiguar si la imagen está cargada, necesita un truco "inteligente" para que funcione en navegadores antiguos, y debe verificar que el comportamiento entre navegadores sea coherenteRecupere información de los elementos de imagen en la página
Prueba de trabajo en Chrome y Firefox
Working jsFiddle (abra su consola para ver el resultado)
Nota: utilicé jQuery , pensé que esto podría funcionar con javascript completo
Encuentro buena información aquí OpenClassRoom -> este es un foro francés
fuente
Detector de red en tiempo real: compruebe el estado de la red sin actualizar la página: (no es jquery, pero está probado y funciona al 100%: (probado en Firefox v25.0))
Código:
Si se pierde la conexión, simplemente presione el botón de nuevo.
Actualización 1: Detección automática sin actualizar la página:
fuente
Después de leer las soluciones interesantes en esta página, creé una solución fácil de usar altamente influenciada por la publicación de SLaks y Noyo que parece estar funcionando en versiones bastante recientes (al momento de escribir) de Chrome, IE, Firefox, Safari y Opera (todo en Windows). Además, funcionó en un emulador de iPhone / iPad que utilicé.
Una diferencia importante entre esta solución y la publicación de SLaks y Noyo es que esta solución verifica principalmente las propiedades naturalWidth y naturalHeight. Descubrí que en las versiones actuales del navegador, esas dos propiedades parecen proporcionar los resultados más útiles y consistentes.
Este código devuelve VERDADERO cuando una imagen se ha cargado completamente Y con éxito. Devuelve FALSE cuando una imagen aún no se ha cargado completamente O no se ha podido cargar.
Una cosa que deberá tener en cuenta es que esta función también devolverá FALSE si la imagen es una imagen de 0x0 píxeles. Pero esas imágenes son bastante poco comunes, y no puedo pensar en un caso muy útil en el que desee comprobar si una imagen de 0x0 píxeles se ha cargado todavía :)
Primero adjuntamos una nueva función llamada "isLoaded" al prototipo HTMLImageElement, para que la función pueda usarse en cualquier elemento de imagen.
Luego, cada vez que necesitemos verificar el estado de carga de la imagen, simplemente llamamos a la función "isLoaded".
Según el comentario de giorgian sobre la publicación de SLaks y Noyo, esta solución probablemente solo se puede usar como una comprobación única en Safari Mobile si planea cambiar el atributo SRC. Pero puede solucionarlo creando un elemento de imagen con un nuevo atributo SRC en lugar de cambiar el atributo SRC en un elemento de imagen existente.
fuente
Así es como lo hice funcionar en el navegador cruzado usando una combinación de los métodos anteriores (también necesitaba insertar imágenes dinámicamente en el dom):
Nota: Deberá proporcionar un estado booleano válido para la variable isIE.
fuente
// O como un complemento
fuente
Según tengo entendido, la propiedad .complete no es estándar. Puede que no sea universal ... Me doy cuenta de que parece funcionar de manera diferente en los versos de Firefox IE. Estoy cargando varias imágenes en javascript y luego comprobando si está completo. En Firefox, esto parece funcionar muy bien. En IE, no lo hace porque las imágenes parecen estar cargando en otro hilo. Funciona solo si pongo un retraso entre mi asignación a image.src y cuando verifico la propiedad image.complete.
Usar image.onload e image.onerror tampoco funciona para mí, porque necesito pasar un parámetro para saber de qué imagen estoy hablando cuando se llama a la función. Cualquier forma de hacerlo parece fallar porque en realidad parece pasar la misma función, no diferentes instancias de la misma función. Entonces, el valor que paso para identificar la imagen siempre termina siendo el último valor en el bucle. No puedo pensar de ninguna manera alrededor de este problema.
En Safari y Chrome, veo que image.complete true y naturalWidth se configuran incluso cuando la consola de error muestra un 404 para esa imagen ... y eliminé intencionalmente esa imagen para probar esto. Pero lo anterior funciona bien para Firefox e IE.
fuente
Este fragmento de código me ayudó a solucionar los problemas de almacenamiento en caché del navegador:
Cuando el caché del navegador está deshabilitado, solo este código no funciona:
para que funcione tienes que agregar:
fuente
Con este
JavaScript
código, puede verificar que la imagen se haya cargado correctamente o no.Prueba esto
fuente
Tuve muchos problemas con la carga completa de una imagen y EventListener.
Lo que sea que intenté, los resultados no fueron confiables.
Pero luego encontré la solución. Técnicamente no es agradable, pero ahora nunca tuve una carga de imagen fallida.
Lo que hice:
En lugar de cargar la imagen una vez, simplemente la cargo por segunda vez directamente después de la primera vez y ambas se ejecutan a través del controlador de eventos.
¡Todos mis dolores de cabeza se han ido!
Por cierto: ustedes de stackoverflow me ayudaron más de cien veces. Por esto muchas gracias!
fuente
Este funcionó bien para mí :)
fuente