2011-04-11 13 views
14

Tengo algo de código bastante básico jQuery:jQuery .load() no disparar sobre imágenes (probablemente el almacenamiento en caché?)

... 
$(this).find('img').load(function(){ 
    loadedImages++; 
    if(loadedImages == $this.find('img').length){ 
... 

Sin embargo, eso no es disparando constantemente. Dispara si hago una actualización o cierro mi navegador, pero una actualización normal, o simplemente presionar la misma URL dos veces en cualquier momento sin borrar el caché, hace que el .load() nunca se active.

¿Alguna idea sobre cómo solucionar esto?

+0

Ver respuestas relevantes [aquí] (http://stackoverflow.com/questions/126772/how-to-force-a-web-browser-not-to-cache-images) –

+0

¡Eso lo hizo gracias! ¡Vea mi respuesta más específica después de leer esas respuestas! –

Respuesta

4

Una forma sería agregar una "variable ficticia" al final de la URL que utiliza para tomar la imagen ... como el tiempo en milisegundos anexado como parámetro de cadena de consulta.

+0

Perfecto, eso funcionó! –

+0

Eso no es crudo, esa es una práctica común. :) –

+0

@Diodeus - Muy cierto ... Editaré la publicación para que no parezca tan mal concebida ... gracias. –

3

Como dijeron Ron y El Guapo, la respuesta es agregar una consulta al final de la URL. Hice esto así:

$(this).find('img').each(function(){ 
    $(this).attr('src',$(this).attr('src')+'?'+new Date().getTime()) 
}).load(function(){ 
    //This will always run now! 
+0

Buen trabajo ilustrando esto !!!! –

+3

Si bien esto responde a la pregunta original, evita que el navegador almacene sus imágenes en la memoria caché, lo que no es ideal ya que ralentizará la carga de la página. –

40

Creo que esto has been discussed before. El problema no es el almacenamiento en caché, sino el momento: es posible que las imágenes ya se hayan cargado antes de conectar el controlador de eventos (para que nunca se active). Esto también puede ocurrir si no ocurre el almacenamiento en caché, por ejemplo en un navegador multiproceso en una conexión muy rápida. Afortunadamente, hay una propiedad .complete que puede utilizar:

var load_handler = function() { 
    loadedImages++; 
    … 
} 
$(this).find('img').filter(function() { 
    return this.complete; 
}).each(load_handler).end().load(load_handler); 

También puede crear su propio evento función de adjuntar:

jQuery.fn.extend({ 
    ensureLoad: function(handler) { 
     return this.each(function() { 
      if(this.complete) { 
       handler.call(this); 
      } else { 
       $(this).load(handler); 
      } 
     }); 
    } 
}); 

y luego llamar de la siguiente manera:

$(this).find('img').ensureLoad(function(){ 
    loadedImages++; 
    if(loadedImages == $this.find('img').length){ 
    … 
}); 
+0

En caso de que cambie dinámicamente el 'src' de la imagen y confíe en el evento" cargar "para hacer algo con él cuando se carga, puede desencadenar la carga manualmente si la imagen ya está en el caché:' image.attr (' src ', ); if (image [0] .complete) {image.trigger ('load')} ' – hakunin

+1

Esta es una solución muy elegante, una mejor respuesta que la aceptada. El que se aceptó es una solución cruda, pero también evita el almacenamiento en caché. En mi aplicación, aparecen más de 30 fotos de alta resolución, así que tuve un problema donde la primera carga demoraba un tiempo hasta que todas las imágenes se cargaban y se calculaban los tamaños (tamaño de diferencia cada vez), y al volver a visitar, el caché hizo que la carga() no se disparara en absoluto. Si desactivo el almacenamiento en caché, llevará mucho tiempo cargar cada vez que ingrese el visitante. – jeffkee

Cuestiones relacionadas