2012-11-13 1 views
28

Sto scrivendo uno script Javascript. Questo script verrà probabilmente caricato in modo asincrono (formato AMD).come sapere se l'evento "load" della finestra è stato attivato già

In questo script, non vorrei fare nulla di importante fino a quando l'evento window.load non è stato attivato. Quindi ascolto l'evento "carica" ​​della finestra.

Ma se lo script viene caricato dopo l'evento window.load ... come posso sapere che window.load è già stato attivato?

E naturalmente non voglio aggiungere qualcosa in qualsiasi altro script (sono tutti caricati asincrono, il problema è lo stesso) :)

Edit:

Immaginate un documento HTML senza Javascript in tutto.

Rispetto a qualcuno inserire in questo documento un tag e questo tag script carica il mio file Javascript.

Questo eseguirà il mio script.

Come questo script può sapere se window.load è già stato attivato?

No jQuery, non uno script nel documento HTML prima del mio.

E 'possibile sapere ??

Ho trovato la proprietà window.document.readystate. Questa proprietà è per l'evento "pronto" del documento, non per la finestra "carica". C'è qualcosa di simile per l'evento "load" della finestra?

+0

perché non usare jQuery documento evento pronto? Altrimenti, collega l'evento window.load e imposta un flag (ad esempio 'window.loadFired') e il timeout della coda per controllare il flag ogni 50ms. –

+0

Puoi semplicemente impostare un valore booleano globale in un evento di caricamento della finestra che non viene caricato in modo asincrono? – Aeoril

+0

Desidero attendere l'evento "carica" ​​della finestra perché prima di questo evento il browser è ancora occupato. Voglio iniziare a lavorare quando il browser è davvero pronto .... Forse è stupido, ma comunque è un problema non essere in grado di sapere se un evento è stato licenziato o no ... non è vero? – Nicolas

risposta

-3

che dire overriding window.load?

window._load = window.load; 
window.load = function(){ 
    window.loaded = true; 
    window._load(); 
} 

quindi controllare

if (window.loaded != undefined && window.loaded == true){ 
    //do stuff 
} 
+2

Questo non farà il lavoro. Se window "load event è già stato attivato, l'override di window.load è inutile, è già stato eseguito, non sarà più ... – Nicolas

1

Se non si desidera utilizzare jQuery, la logica che utilizza è:

if(!document.body) 
    setTimeout(checkAgain, 1); 

Così tra le finestre caricate evento e controllando se la la proprietà del corpo del documento è disponibile, è possibile verificare se il DOM è pronto

+2

document.body è disponibile quando DOM è pronto, non quando viene attivata la finestra" load " Questa soluzione serve a rilevare il documento "pronto" (DOM ready), ma preferirei indovinare l'evento "load" della finestra ... – Nicolas

2

Ecco la mia risposta:

fiddle

window.addEventListener("load", function() { 
    window.loaded = true; 
}); 

function logLoaded() { 
    console.log("loaded"); 
} 

(function listen() { 
    if (window.loaded) { 
     logLoaded(); 
    } else { 
     console.log("notLoaded"); 
     window.setTimeout(listen, 50); 
    } 
})(); 

Si può leggere su addEventListener() e la sua compatibilità (è una novità per l'ECMAScript 5 spec) here. È il nuovo modo "preferito" per fare le cose andando avanti.

È possibile leggere su Function Expressions (IIFE) Immediately Invoked (in alternativa, funzioni anonime autodefinite o funzioni anonime richiamate immediatamente) here.

EDIT: Ecco una buona risposta già su StackOverflow:

How to check if DOM is ready without a framework?

Se specificamente vuole sapere se l'evento carico DOM ha sparato, impostare una variabile globale in 'carico' un DOM gestore di eventi e quindi verificare la sua esistenza quando viene caricato il nuovo codice.

// in 'load' event handler 
window.domLoadEventFired = true; 

// in code you are loading asynchronously 
if (typeof window.domLoadEventFired !== undefined) { 
    // ... 
} 
+1

Per far funzionare questa soluzione, è necessario che il codice venga eseguito prima dell'evento "load" della finestra. Anche se è piccolo, questo script deve essere caricato in modo sincrono (o scritto direttamente nel documento HTML), oppure non si può essere sicuri che sia eseguito prima che la finestra "carichi" .... ho sbagliato? – Nicolas

+0

Hai ragione. Pensa a qualsiasi altro modo, però, in questo momento. Se riesci a gestire la questione! document.body, potrebbe non averne bisogno, ma non sono sicuro di quale sia la relazione con il licenziamento dell'evento di carico – Aeoril

+0

Posso chiedere a cosa serve un codice sincrono? @Nicolas – Aeoril