Quiero hacer:
$("img").bind('load', function() {
// do stuff
});
Pero el evento de carga no se dispara cuando la imagen se carga desde la memoria caché. Los documentos de jQuery sugieren un complemento para solucionar esto, pero no funciona
jquery
image
jquery-events
jquery-load
Tom Lehman
fuente
fuente
Respuestas:
Si
src
ya está configurado, entonces el evento se activa en el caso en caché, incluso antes de que el controlador de eventos esté vinculado. Para solucionar esto, puede recorrer la comprobación y desencadenar el evento según.complete
esto:Tenga en cuenta el cambio de
.bind()
a.one()
para que el controlador de eventos no se ejecute dos veces.fuente
setTimeout(function(){//do stuff},0)
dentro de la función 'cargar' ... el 0 le da al sistema del navegador (DOM) una marca adicional para garantizar que todo se actualice correctamente..load()
no activa el evento y tiene 1 argumento requerido, use.trigger("load")
en su lugar¿Puedo sugerirle que lo vuelva a cargar en un objeto de imagen que no sea DOM? Si está en caché, esto no tomará tiempo en absoluto, y la carga seguirá disparando. Si no está en caché, disparará la carga cuando se cargue la imagen, que debería ser al mismo tiempo que la versión DOM de la imagen termina de cargarse.
Javascript:
Actualizado (para manejar múltiples imágenes y con el archivo adjunto de carga correctamente ordenado):
fuente
load
controlador antes de que se agregue, también esto no funcionará, pero para una imagen, el código OP funciona para muchos :)#img
es una ID, no un selector de elementos :) Tambiénthis.src
funciona, no es necesario usar jQuery donde no se necesita :) Pero crear otra imagen parece exagerado en cualquier caso IMO.imageLoaded
, usetmp.onload = imageLoaded.bind(this)
Mi solución simple, no necesita ningún complemento externo y para casos comunes debería ser suficiente:
úsalo así:
por ejemplo, para desvanecerse en sus imágenes en carga puede hacer:
O como alternativa, si prefiere un enfoque tipo jquery:
y úsalo de esta manera:
por ejemplo:
fuente
width
,max-height
y la licenciaheight:auto
, a menudo es necesario para establecer la anchura y la altura sólo si es necesario para estirar la imagen; para una solución más robusta, usaría un complemento como ImagesLoaded¿Realmente tienes que hacerlo con jQuery? También puede adjuntar el
onload
evento directamente a su imagen;Se disparará cada vez que la imagen se haya cargado, desde caché o no.
fuente
onload
controlador cuando la imagen se cargue por segunda vez desde el caché?También puede usar este código con soporte para errores de carga:
fuente
load
primero el controlador y luego llamarlo más tarde en laeach
función.Yo mismo tuve este problema, busqué en todas partes una solución que no implicara matar mi caché o descargar un complemento.
No vi este hilo inmediatamente, así que encontré algo más que es una solución interesante y (creo) digna de publicar aquí:
De hecho, obtuve esta idea de los comentarios aquí: http://www.witheringtree.com/2009/05/image-load-event-binding-with-ie-using-jquery/
No tengo idea de por qué funciona, pero lo he probado en IE7 y dónde se rompió antes de que ahora funcione.
Espero eso ayude,
Editar
La respuesta aceptada en realidad explica por qué:
fuente
$image.load(function(){ something(); }).attr('src', $image.attr('src'));
restablecer la fuente original.Al usar jQuery para generar una nueva imagen con el src de la imagen, y asignar el método de carga directamente a eso, se llama con éxito al método de carga cuando jQuery termina de generar la nueva imagen. Esto funciona para mí en IE 8, 9 y 10
fuente
Una solución que encontré https://bugs.chromium.org/p/chromium/issues/detail?id=7731#c12 (Este código se tomó directamente del comentario)
fuente
Una modificación al ejemplo de GUS:
Establezca la fuente antes y después de la carga.
fuente
src
antes de adjuntar elonload
controlador, una vez después será suficiente.Simplemente vuelva a agregar el argumento src en una línea separada después de definir el objeto img. Esto engañará a IE para que active el evento lad. Es feo, pero es la solución más simple que he encontrado hasta ahora.
fuente
Te puedo dar un pequeño consejo si quieres hacer esto:
Si hace eso cuando el navegador almacena imágenes en caché, no hay problema, siempre se muestra la imagen, pero se carga debajo de la imagen real.
fuente
Tuve este problema con IE donde e.target.width no estaría definido. El evento de carga se dispararía, pero no pude obtener las dimensiones de la imagen en IE (Chrome + FF funcionó).
Resulta que debes buscar e.currentTarget.naturalWidth & e.currentTarget.naturalHeight .
Una vez más, IE hace las cosas de manera propia (más complicada).
fuente
Puede resolver su problema utilizando el complemento JAIL que también le permite cargar imágenes de manera diferida (mejorando el rendimiento de la página) y pasando la devolución de llamada como parámetro
El HTML debería verse así
fuente
Si desea una solución CSS pura, este truco funciona muy bien: use el objeto de transformación. Esto también funciona con imágenes cuando están en caché o no:
CSS:
HTML:
Ejemplo de codepen
Codepen MENOS ejemplo
fuente