2011-04-11 10 views
14

ho qualche codice jQuery piuttosto semplice:jQuery .load() non sta lavorando sulle immagini (probabilmente la cache?)

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

Tuttavia, thats non sparare in modo coerente. Si attiva se eseguo un aggiornamento o chiudo il browser, ma un normale aggiornamento o semplicemente premendo lo stesso URL due volte in qualsiasi momento senza cancellare la cache fa sì che il .load() non venga attivato.

Qualche idea su come risolvere questo problema?

+0

See risposte pertinenti [qui] (http://stackoverflow.com/questions/126772/how-to-force-a-web-browser-not-to-cache-images) –

+0

Questo lo ha fatto grazie! Vedi la mia risposta più specifica dopo aver letto quelle risposte! –

risposta

4

Un modo sarebbe aggiungere una "variabile fittizia" alla fine dell'URL che si usa per catturare l'immagine ... come il tempo in millisecondi aggiunto come parametro della stringa di query.

+0

Perfetto, ha funzionato! –

+0

Non è rozzo, è una pratica comune. :) –

+0

@Diodeus - Molto vero ... modifico il post in modo che non sembri così mal concepito ... grazie. –

3

Come hanno detto Ron e El Guapo, la risposta è aggiungere una query alla fine dell'URL. Ho fatto questo in questo modo:

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

Bel lavoro che illustra questo !!!! –

+3

Sebbene questo risponda alla domanda originale, impedisce che le immagini vengano memorizzate nella cache dal browser, non è l'ideale in quanto rallenterà il caricamento della pagina. –

40

Penso che questo has been discussed before. Non è il caching di per sé che è il problema, ma il tempismo: le immagini potrebbero essere già state caricate dal momento in cui il gestore eventi è collegato (quindi non viene mai attivato). Ciò si può anche verificare se non si verifica alcuna memorizzazione nella cache, ad esempio in un browser con multithreading su una connessione molto veloce. Fortunatamente, c'è una proprietà .complete che è possibile utilizzare:

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

È anche possibile creare il proprio evento allegare funzione:

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

E poi chiamare i seguenti:

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

Nel caso in cui si modifichi in modo dinamico 'src' dell'immagine e si faccia affidamento sull'evento" load "per fare qualcosa con esso quando viene caricato, è possibile attivare manualmente il caricamento se l'immagine è già nella cache in questo modo:' image.attr (' src ', ); if (image [0] .complete) {image.trigger ('load')} ' – hakunin

+1

Questa è una soluzione molto elegante, una risposta migliore di quella accettata. Quello che è stato accettato è una soluzione grezza ma impedisce anche il caching. Nella mia app, ci sono più di 30 foto ad alta risoluzione, quindi ho avuto un problema in cui il primo caricamento avrebbe richiesto un po 'di tempo prima che tutte le immagini fossero caricate e le dimensioni calcolate (dimensione di diff ogni volta), e quando si ri-visitava, la cache ha causato il caricamento() per non accendere affatto. Se disabilito la memorizzazione nella cache ci vorrà molto tempo per caricare ogni volta che il visitatore entra. – jeffkee