2011-06-08 23 views
18

Tengo un widget de barra lateral que tiene un fondo de imagen.¿Cómo puedo saber cuándo se cargó una imagen de fondo CSS? ¿Se disparó un evento?

Más de esto es un formulario de entrada de búsqueda. No quiero que se muestre la entrada antes de que se cargue la imagen.

¿Hay alguna manera de asociar un controlador de eventos load a imágenes de fondo CSS como elementos/objetos img normales?

Sé que esto podría hacerse en una imagen normal, pero me gustaría mantenerlo como un fondo de CSS porque la imagen es parte de un sprite. Estoy usando jQuery, por lo que las soluciones que usan jQuery o DOM DOM JS son igualmente buenas.

+0

Posible duplicado de [Evento desencadenante en la carga de la imagen de fondo] (http://stackoverflow.com/questions/3281651/trigger-event-on-background-image-load) – azerafati

Respuesta

20

Puede cargar la misma imagen usando la imagen oculta DOM/a y enlazar al evento load en eso. El almacenamiento en caché del navegador debe tener cuidado de no cargar la imagen dos veces, y si la imagen ya está cargada, el evento debe dispararse inmediatamente ... no probado, difícil.

+0

Sí.Esta es una buena idea. Solo haz así! –

+0

Y aquí le mostramos cómo hacerlo: http://stackoverflow.com/a/5058336/3062017 –

+0

En el futuro, un método más avanzado, predecible y posiblemente más eficiente para detectar si los recursos se referenciaron en CSS (imágenes, fuentes ...) han cargado usar [ServiceWorkers] (https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API) y [postMessage] (http://www.w3.org/TR/ service-workers/# service-worker-postmessage): el trabajador del servicio cargaría el activo, lo pasaría a la página y publicaría un mensaje para indicar que el activo se había cargado, de manera que fuera accionable desde dentro de JS, sin depender de el propio almacenamiento en caché del navegador para evitar una solicitud adicional. –

1

No establezca el fondo en css, pero cargue la imagen en una etiqueta img creada con javascript (o mejor, jquery). una vez cargada, activará el evento de carga. cuando se activa este evento, aplique la propiedad de estilo a su div

+0

He intentado este enfoque para evitar la falta de IE8 de un evento "DOMContentLoaded" que parece ser el motivo por el cual .ready() no funciona con <= IE8 ... sin embargo, parece que tampoco funciona. Consulte la documentación de jquery para .load() en http://api.jquery.com/load-event/ en "Advertencias del evento de carga cuando se utiliza con imágenes" – mutex

+0

¿No establece el fondo en css? Escucha. Uso la imagen de fondo CSS para poder usar la opción "cubierta". Esto no es posible con la etiqueta de imagen a menos que use una biblioteca que no creo que exista al momento de escribir esto. – MurWade

6

En Chrome, usar .ready() de jQuery parece funcionar para mí. Aquí está mi violín:

http://jsfiddle.net/pWjBM/5/

La imagen es sólo un azar que he seleccionado es razonablemente grande - que realmente se necesita mucho tiempo para cargar en algunos de mis pruebas, por lo que puede valer la pena sustituir con algo un un poco más pequeño Pero el resultado final es lo que quiere. Creo que lleva un tiempo cargar, y una vez que se carga, aparece la alerta y luego aparece el cuadro de texto (#txt). Parece que también funciona en Firefox; no estoy seguro acerca de otros navegadores.

EDITAR: Hah, parece funcionar en Chrome, Firefox y Safari. No funciona en IE8. Entonces ... funciona en todos los navegadores reales :)

EDIT2: Después de mucho alboroto, una combinación de Allesandro y mi propia solución parece para funcionar. Uso .ready() en un img oculto para detectar cuando la imagen está realmente cargada, y luego lo cargo en un fondo CSS.

http://jsfiddle.net/pWjBM/41/

HTML:

<div id="testdiv"> 
    <input type="text" id="txt" style="display:none;" /> 
</div> 
<img src="http://www.nasa.gov/sites/default/files/images/712130main_8246931247_e60f3c09fb_o.jpg" id="dummy" style="display:none;" alt="" /> 

Javascript:

$(function() { 
    $('#dummy').ready(function() { 
     alert('loaded'); 
     $('#testdiv').css('background-image', 'url(http://www.nasa.gov/sites/default/files/images/712130main_8246931247_e60f3c09fb_o.jpg)'); 
     $('#txt').show(1000); 
    }); 
}); 

CSS:

#testdiv { 
    background:#aaaaaa none no-repeat right top; 
    width: 400px; 
    height: 400px; 
} 

#txt{ 
    margin-left: 180px; 
    margin-top: 140px; 
} 

NOTA: Hay un comentario a continuación de este trabajo no se porque puede cambiar la url de la imagen y todavía dispara el evento cargado. De hecho, esto funciona bastante exactamente como esperaba dado el código actual: no comprueba si la URL a la que apunta para su "imagen" es válida y realmente es una imagen, todo lo que hace es disparar un evento. cuando el img esté listo y cambie el fondo. La suposición en el código es que su url apunta a una imagen válida, y creo que cualquier otra verificación de error no es realmente necesaria dada la pregunta.

Cuestiones relacionadas