evento image.onload e cache del browser


113

Desidero creare una casella di avviso dopo il caricamento di un'immagine, ma se l'immagine viene salvata nella cache del browser, l' .onloadevento non verrà attivato.

Come faccio ad attivare un avviso quando un'immagine è stata caricata indipendentemente dal fatto che l'immagine sia stata memorizzata nella cache o meno?

var img = new Image();
img.src = "img.jpg";
img.onload = function () {
   alert("image is loaded");
}

Risposte:


153

Mentre stai generando l'immagine in modo dinamico, imposta la onloadproprietà prima del src.

var img = new Image();
img.onload = function () {
   alert("image is loaded");
}
img.src = "img.jpg";

Fiddle : testato sulle ultime versioni di Firefox e Chrome.

Puoi anche usare la risposta in questo post , che ho adattato per una singola immagine generata dinamicamente:

var img = new Image();
// 'load' event
$(img).on('load', function() {
  alert("image is loaded");
});
img.src = "img.jpg";

Violino


Aspettare. Perché il secondo esempio di codice fa la cosa sbagliata e viene impostato .srcprima di impostare .onload? Avevi ragione nel primo esempio di codice, ma hai incasinato il secondo. Il secondo non funzionerà correttamente in alcune versioni di IE.
jfriend00

1
@ jfriend00 No, non è un casino. Il codice di backup (il secondo) è esattamente nel caso in cui il primo in qualche modo smetta di funzionare. =]Utilizza un .completecontrollo nel caso in cui l'immagine fosse già memorizzata nella cache, quindi il codice lo stava dimostrando. Ovviamente, per la migliore pratica, puoi sempre impostare l' srcassociazione dei gestori dopo tutto.
Fabrício Matté

4
Non c'è proprio NESSUN motivo per fare affidamento .completein questo caso. È sufficiente impostare l'attrezzatura di presa del carico prima dell'impostazione .srce non è MAI necessario. Ho scritto una presentazione che viene utilizzata da migliaia di siti in ogni browser immaginabile e la prima tecnica funziona ogni volta. Non è necessario controllare mai .completequando si crea una nuova immagine da zero come questa.
jfriend00

Va bene, grazie per l'avviso, ha aggiornato la risposta per riflettere il tuo ragionamento =]. Anche @ jfriend00 potresti controllare se l'immagine viene caricata in IE? Mi chiedo se è un problema con la mia rete o con IE e l'immagine.
Fabrício Matté

9
Anche oggi ho scoperto che webkit ha bisogno img.src = ''prima di assegnare un nuovo src se era usato prima.
quux

10

Se src è già impostato, l'evento viene attivato nel caso memorizzato nella cache prima ancora che venga associato il gestore di eventi. Quindi, dovresti attivare anche l'evento in base .complete.

codice di esempio:

$("img").one("load", function() {
   //do stuff
}).each(function() {
   if(this.complete || /*for IE 10-*/ $(this).height() > 0)
     $(this).load();
});

6

Esistono due possibili soluzioni per questo tipo di situazioni:

  1. Usa la soluzione suggerita in questo post
  2. Aggiungi un suffisso univoco all'immagine srcper forzare il browser a scaricarla di nuovo, in questo modo:

    var img = new Image();
    img.src = "img.jpg?_="+(new Date().getTime());
    img.onload = function () {
        alert("image is loaded");
    }

In questo codice ogni volta che aggiungi il timestamp corrente alla fine dell'URL dell'immagine lo rendi unico e il browser scaricherà di nuovo l'immagine


44
Tutto ciò che fa è sconfiggere il caching. È il modo SBAGLIATO per risolvere questo problema. Il modo giusto è nella risposta di Fabricio. Basta impostare il .onloadgestore prima di impostare il .srcvalore e non ti perderai l'evento onload in alcune versioni di IE.
jfriend00

1
sì, hai ragione, ma non è sempre desiderabile memorizzare nella cache, a volte le immagini non dovrebbero essere memorizzate nella cache. ovviamente in questa particolare situazione dipende dalle esigenze
haynar

1
Nella mia app angolare ho provato tutto ciò che dicono le altre risposte, ma non ho aiutato. Ma forzare a non memorizzare nella cache come questa risposta dice che ha funzionato per me. Quindi più uno da me.
Thanu

L'unica soluzione che ha funzionato per me nell'ultima versione di Chrome.
Young Bob,

3

Oggi ho incontrato lo stesso problema. Dopo aver provato vari metodi, mi rendo conto che inserire semplicemente il codice di dimensionamento all'interno $(window).load(function() {})invece di document.readyrisolvere parte del problema (se non stai modificando la pagina).


Questa è anche una buona risposta per la situazione in cui il browser ha l'immagine memorizzata nella cache, funziona bene con il caricamento della finestra
Shocker

esattamente il problema che stavo affrontando. cambiando $(document).readyper $(window).loadrisolto il mio problema.
Tariqul Islam,

0

Ho scoperto che puoi farlo semplicemente in Chrome:

  $('.onload-fadein').each(function (k, v) {
    v.onload = function () {
        $(this).animate({opacity: 1}, 2000);
    };
    v.src = v.src;
});

L'impostazione di .src su se stesso attiverà l'evento onload.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.