Quiero establecer una imagen de fondo en la etiqueta del cuerpo, luego ejecutar un código, como este:
$('body').css('background-image','http://picture.de/image.png').load(function() {
alert('Background image done loading');
// This doesn't work
});
¿Cómo puedo asegurarme de que la imagen de fondo esté completamente cargada?
javascript
jquery
Peter
fuente
fuente
Image()
objeto que tieneonload
evento.url()
Respuestas:
prueba esto:
esto creará una nueva imagen en la memoria y usará el evento de carga para detectar cuándo se carga el src.
fuente
javascript:void($('<img/>').attr('src', 'http://farm6.static.flickr.com/5049/5220175127_5693faf952.jpg').load(function() { $('html').css('background-image', 'url(http://farm6.static.flickr.com/5049/5220175127_5693faf952.jpg)'); }))
y verifique las solicitudes HTTP en Firebug. Si he abierto una página de parpadeo con esta imagen abierta en otra pestaña, no hace ninguna solicitud HTTP, solo muestra esta imagen al instante. y cuando borro el caché y lo ejecuto hubo una solicitud..remove()
al$('<img/>')
objeto para evitar una pérdida de memoria. Debería ver un consumo de memoria estable en la primera prueba y un aumento de memoria en la segunda. Después de unas pocas horas de ejecución en Chrome 28, la primera prueba toma 80 MB y la segunda 270 MB.Tengo un complemento jQuery llamado
waitForImages
que puede detectar cuándo se han descargado las imágenes de fondo.fuente
each
devolución de llamada.delay()
no funciona así.Algo como esto:
fuente
bg.replace( ... , my_src )
. Pero mi pregunta es: una vez que se carga $ ('<img>'), qué sucede exactamente con eso<img>
... Quiero decir que no es real, es solo un marcador de posición ficticio, ¿verdad?<img>
nunca se inserta en el DOM; solo se usa para "engañar" al navegador para que cargue el archivo de imagen en la caché.No hay devoluciones de llamada JS para activos CSS.
fuente
solución JS pura que agregará un precargador, establecerá la imagen de fondo y luego la configurará para la recolección de basura junto con su detector de eventos :
Version corta:
Un poco más con buena transición de opacidad:
fuente
Aquí hay un pequeño complemento que hice para permitirle hacer exactamente esto, también funciona en múltiples imágenes de fondo y múltiples elementos:
Leer el artículo:
http://catmull.uk/code-lab/background-image-loaded/
o vaya directamente al código del complemento:
http://catmull.uk/downloads/bg-loaded/bg-loaded.js
Tan solo incluya el complemento y luego instálelo en el elemento:
Obviamente descargue el complemento y guárdelo en su propio alojamiento.
Por defecto, agrega una clase adicional "bg-loaded" a cada elemento coincidente una vez que se carga el fondo, pero puede cambiarlo fácilmente pasándole una función diferente como esta:
Aquí hay un codepen que demuestra que funciona.
http://codepen.io/catmull/pen/Lfcpb
fuente
He encontrado una solución que funcionó mejor para mí y que tiene la ventaja de ser utilizable con varias imágenes (el caso no se ilustra en este ejemplo).
De la respuesta de @ adeneo a esta pregunta :
fuente
Hice un truco de javascript puro para hacer esto posible.
O
css:
fuente
https://github.com/alexanderdickson/waitForImages
fuente