finestra.onload vs documento.onload [chiuso]
-
09-09-2019 - |
Domanda
Che è più ampiamente supportato: window.onload
o document.onload
?
Soluzione
Quando si sparano?
- Per impostazione predefinita, viene licenziato quando l'intero caricamento della pagina, tra cui i contenuti (immagini, CSS, script, ecc.).
In alcuni browser ora assume il ruolo di document.onload
e gli incendi quando il DOM è pronto pure.
document.onload
- Viene chiamato quando il DOM è pronto che può essere prima per immagini e altri contenuti esterno viene caricato.
Come pure sono hanno sostenuto?
window.onload
sembra essere il più ampiamente supportato. In effetti, alcuni dei browser più moderni hanno in un certo senso sostituita con document.onload
window.onload
.
problemi di supporto del browser sono probabilmente il motivo per cui molte persone stanno iniziando a utilizzare le librerie quali jQuery per gestire il controllo per il documento essere pronti, in questo modo:
$(document).ready(function() { /* code here */ });
$(function() { /* code here */ });
Ai fini della storia. window.onload
vs body.onload
:
Una domanda simile è stato chiesto su codingforums un po ' indietro per quanto riguarda l'utilizzo di
window.onload
soprabody.onload
. Il risultato sembrava essere che si dovrebbe usarewindow.onload
perché è buona per separare la struttura dall'azione.
Altri suggerimenti
L'idea generale è che finestra.onload incendi quando il documento della finestra pronto per la presentazione e documento.onload incendi quando il Albero DOM (costruito dal codice all'interno del documento) è completato.
Idealmente, l'iscrizione al Albero DOM eventi, permette offscreen-manipolazioni tramite Javascript, incorrere in quasi nessun carico della CPU.Al contrario, window.onload
può prendere un po ' di fuoco, quando più risorse esterne devono ancora essere richiesto, analisi e caricamento.
►Scenario di Test:
Osservare la differenza e come il vostro browser di scelta implementa la predetta gestori di eventi, è sufficiente inserire il seguente codice all'interno del documento - <body>
- tag.
<script language="javascript">
window.tdiff = []; fred = function(a,b){return a-b;};
window.document.onload = function(e){
console.log("document.onload", e, Date.now() ,window.tdiff,
(window.tdiff[0] = Date.now()) && window.tdiff.reduce(fred) );
}
window.onload = function(e){
console.log("window.onload", e, Date.now() ,window.tdiff,
(window.tdiff[1] = Date.now()) && window.tdiff.reduce(fred) );
}
</script>
►Risultato:
Qui è il comportamento risultante, osservabili per Chrome v20 (e probabilmente la maggior parte degli attuali browser).
- No
document.onload
evento. onload
si attiva due volte quando dichiarato all'interno del<body>
, una volta quando dichiarato all'interno del<head>
(dove l'evento è quindi agisce comedocument.onload
).- conteggio e di agire dipendenti dallo stato del contatore permette di emulare eventi comportamenti.
- In alternativa, dichiarare la
window.onload
gestore di eventi all'interno dei confini del HTML<head>
elemento.
►Progetto Di Esempio:
Il codice di cui sopra è presa da questo progetto codebase (index.html
e keyboarder.js
).
Per un elenco di gestori di eventi dell'oggetto window, si prega di consultare il MDN documentazione.
Aggiungi evento Listener
<script type="text/javascript">
document.addEventListener("DOMContentLoaded", function(event) {
// - Code to execute when all DOM content is loaded.
// - including fonts, images, etc.
});
</script>
Update March 2017
1 vaniglia JavaScript
window.addEventListener('load', function() {
console.log('All assets are loaded')
})
2 jQuery
$(window).on('load', function() {
console.log('All assets are loaded')
})
Buona fortuna.
parsing del codice HTML - La fine ,
-
Il browser analizza il codice HTML e script viene eseguito differite.
-
Un
DOMContentLoaded
viene inviato aldocument
quando tutto il codice HTML è stato analizzato e hanno eseguito. L'evento bolle alwindow
. -
il browser carica le risorse (come immagini) che ritardano l'evento carico.
-
Un evento
load
viene inviato alwindow
.
Pertanto, l'ordine di esecuzione sarà
- listener di eventi
DOMContentLoaded
diwindow
nella fase di cattura - listener di eventi
DOMContentLoaded
didocument
- listener di eventi
DOMContentLoaded
diwindow
in fase di bolla - listener di eventi
load
(compresi gestore di eventionload
) diwindow
Un listener di eventi bolla load
(tra cui gestore di eventi onload
) in document
non dovrebbe mai essere invocato. potrebbero essere invocati solo catturare ascoltatori load
, ma a causa del carico di un sub-risorsa come un foglio di stile, non a causa del carico del documento stesso.
window.addEventListener('DOMContentLoaded', function() {
console.log('window - DOMContentLoaded - capture'); // 1st
}, true);
document.addEventListener('DOMContentLoaded', function() {
console.log('document - DOMContentLoaded - capture'); // 2nd
}, true);
document.addEventListener('DOMContentLoaded', function() {
console.log('document - DOMContentLoaded - bubble'); // 2nd
});
window.addEventListener('DOMContentLoaded', function() {
console.log('window - DOMContentLoaded - bubble'); // 3rd
});
window.addEventListener('load', function() {
console.log('window - load - capture'); // 4th
}, true);
document.addEventListener('load', function(e) {
/* Filter out load events not related to the document */
if(['style','script'].indexOf(e.target.tagName.toLowerCase()) < 0)
console.log('document - load - capture'); // DOES NOT HAPPEN
}, true);
document.addEventListener('load', function() {
console.log('document - load - bubble'); // DOES NOT HAPPEN
});
window.addEventListener('load', function() {
console.log('window - load - bubble'); // 4th
});
window.onload = function() {
console.log('window - onload'); // 4th
};
document.onload = function() {
console.log('document - onload'); // DOES NOT HAPPEN
};
In Chrome, window.onload è diverso da <body onload="">
, mentre sono gli stessi in entrambi Firefox (versione 35.0) e IE (versione 11).
Si potrebbe scoprire che il seguente frammento:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!--import css here-->
<!--import js scripts here-->
<script language="javascript">
function bodyOnloadHandler() {
console.log("body onload");
}
window.onload = function(e) {
console.log("window loaded");
};
</script>
</head>
<body onload="bodyOnloadHandler()">
Page contents go here.
</body>
</html>
E vedrete entrambi "finestra caricato" (che deriva in primo luogo) e "body onload" in consolle Chrome. Tuttavia, si vedrà solo "onload del corpo" in Firefox e IE. Se si esegue "window.onload.toString()
" nella console di IE e FF, si vedrà:
"funzione onLoad (event) {bodyOnloadHandler ()}"
il che significa che l'assegnazione "window.onload = function (e) ..." viene sovrascritto.
window.onload
e onunload
sono scorciatoie per document.body.onload
e document.body.onunload
document.onload
e conduttore onload
su tutti i tag HTML sembra essere riservato però mai innescato
'onload
' nel documento -> true
window.onload tuttavia essi sono spesso la stessa cosa. Allo stesso modo body.onload diventa window.onload in IE.
window.onload è lo standard, tuttavia -. Il browser web nella PS3 (sulla base di Netfront) non supporta l'oggetto finestra, quindi non è possibile utilizzare lì