quando viene lanciato window.onload

Sono un po ‘confuso da quando viene lanciato l’evento window.onload. Ad esempio: ho una pagina che ha un sacco di file js esterni e anche un caricamento su richiesta dello script (creando dynamicmente un tag). Tutto questo codice è nella pagina (cioè non viene licenziato al clic o smth, dovrebbe essere eseguito durante il caricamento). Ora diciamo che ho window.onload = somefunction () nell’ultimo javascript on-demand. È ansible che window.onload si avvii prima che tutti gli script vengano effettivamente caricati?

window.onload (aka body.onload ) viene body.onload dopo l’HTML principale, tutto il CSS, tutte le immagini e tutte le altre risorse sono state caricate e renderizzate. Quindi, se le immagini si bloccano, potrebbe volerci del tempo.

Se hai solo bisogno dell’HTML (DOM), puoi usare jQuery $(document).ready()$(document).ready() quando l’HTML è stato analizzato ma prima che il browser abbia finito di caricare tutte le risorse esterne (immagini e fogli di stile che vengono dopo il tuo elemento di script nell’HTML ).

Gli script incorporati nella pagina vengono eseguiti quando il browser analizza di ciascuno. Quindi per eseguire uno script prima di qualsiasi altro script, aggiungi un tag nell'intestazione subito dopo .

Ciò significa che puoi "emulare" window.onload aggiungendo un tag come ultimo elemento di .

No. window.onload () viene richiamato quando tutte le risorse (documento, oggetti, immagini, css, ecc.) Hanno finito il rendering.

Non ho letto la domanda Sì, è del tutto ansible che l’evento window.onload si avvii prima che uno script aggiunto in modo dinamico abbia completato il download. Gli script aggiunti utilizzando il DOM ( document.createElement () ) vengono scaricati in modo asincrono e non sono soggetti alla solita regola che window.onload () attende che tutte le risorse finiscano di scaricare per prime.

Ho creato una suite di test per te, http://jsfiddle.net/ywSMW/ . Questo script aggiunge lo script jQuery al DOM in modo dinamico e scrive il valore di $ sulla console durante il gestore di caricamento . Quindi scrive nuovamente il valore un secondo dopo. Anche con lo script in fase di memorizzazione nella cache, la prima scrittura sulla console viene restituita indefinita , il che significa che l’onload è stato triggersto anche prima che lo script jQuery sia stato scaricato e analizzato.

Testato su IE e Chrome.


Ri: i commenti, se si desidera verificare se l’evento onload è già stato triggersto, è ansible impostare il valore di una variabile globale all’interno del gestore onload :

 var windowHasLoaded = false; window.onload = function () { windowHasLoaded = true; } function doSomethingWhenWindowHasLoaded() { if (!windowHasLoaded) { // onload event hasn't fired yet, wait 100ms and check again window.setTimeout(doSomethingWhenWindowHasLoaded, 100); } else { // onload event has already fired, so we can continue } }