okno.onload vs document.onload
Który jest szerzej obsługiwany: window.onload
Czy document.onload
?
9 answers
Kiedy strzelają?
- domyślnie jest wywoływana, gdy wczytuje się cała strona, łącznie z jej zawartością (obrazy, CSS, skrypty itp.).
W niektórych przeglądarkach przejmuje teraz rolę document.onload
i uruchamia się, gdy DOM jest również gotowy.
document.onload
- jest wywoływany, gdy DOM jest gotowy, który może być przed do obrazów i innych zewnętrznych treści jest ładowany.
Jak dobrze są wsparcie?
window.onload
wydaje się być najbardziej wspierane. W rzeczywistości niektóre z najnowocześniejszych przeglądarek zostały w pewnym sensie zastąpione document.onload
przez window.onload
.
Problemy z obsługą przeglądarki są najprawdopodobniej powodem, dla którego wiele osób zaczyna używać bibliotek, takich jak jQuery do obsługi sprawdzania, czy dokument jest gotowy.]}
$(document).ready(function() { /* code here */ });
$(function() { /* code here */ });
Dla celów historii. window.onload
vs body.onload
:
Podobne pytanie zadano na codingforums a while powrót do użycia
window.onload
overbody.onload
. Na wynik wydaje się, że należy użyćwindow.onload
, ponieważ jest dobrze jest oddzielić swoją strukturę od akcji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-25 08:15:35
Ogólna idea jest taka, że okno.onload jest wywołany, gdy okno dokumentu jest gotowe do prezentacji i dokumentu.wywołanie onload gdy drzewo DOM (zbudowane na podstawie kodu znaczników w dokumencie) jest zakończone .
Idealnie, subskrybowanie zdarzeń Dom-tree , pozwala na manipulacje offscreen poprzez Javascript, nie obciążając prawie procesora . Kontrastowo, window.onload
can take a while to odpal , gdy wiele zewnętrznych zasobów musi zostać jeszcze poproszonych, przeanalizowanych i załadowanych.
►scenariusz testu:
Aby zaobserwować różnicę i jak twoja przeglądarka z wyboru implementuje wyżej wymienione procedury obsługi zdarzeń , po prostu wstaw poniższy kod w znaczniku - <body>
- dokumentu.
<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>
►wynik:
Oto wynikowe zachowanie, które można zaobserwować w Chrome v20 (i prawdopodobnie najbardziej aktualnym przeglądarki).
- nie
document.onload
Zdarzenie. -
onload
zostanie wywołane dwukrotnie, gdy zostanie zadeklarowane wewnątrz<body>
, raz, gdy zostanie zadeklarowane wewnątrz<head>
(gdzie zdarzenie działa wtedy jakodocument.onload
). - liczenie i działanie zależne od stanu licznika pozwala na emulację obu zachowań zdarzeń.
- alternatywnie zadeklaruj obsługę zdarzeń
window.onload
w granicach elementu HTML-<head>
.
►Przykładowy Projekt:
Powyższy kod pochodzi z Kod projektu (index.html
i keyboarder.js
).
Lista procedur obsługi zdarzeń obiektu window znajduje się w dokumentacji MDN.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-17 17:37:27
Add Event 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
14]}
window.addEventListener('load', function() {
console.log('All assets are loaded')
})
window.addEventListener('load', function() {
console.log('All assets are loaded')
})
2 jQuery
$(window).on('load', function() {
console.log('All assets are loaded')
})
Powodzenia.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-31 10:04:43
Zgodnie z parsowanie dokumentów HTML-koniec ,
Przeglądarka przetwarza źródło HTML i uruchamia skrypty odroczone.
A
DOMContentLoaded
jest wysyłane wdocument
, gdy cały HTML został parsowany i uruchomiony. Zdarzenia dowindow
.Przeglądarka ładuje zasoby (takie jak obrazy), które opóźniają Zdarzenie ładowania.
Zdarzenie
load
jest wysyłane wwindow
.
Dlatego kolejność wykonania będzie
-
DOMContentLoaded
słuchacze zdarzeńwindow
w fazie przechwytywania -
DOMContentLoaded
słuchacze zdarzeń zdocument
-
DOMContentLoaded
słuchacze zdarzeńwindow
w fazie bańki -
load
event listeners (includingonload
event handler) ofwindow
Bąbelkowy detektor zdarzeń load
(w tym detektor zdarzeń onload
) W document
nigdy nie powinien być wywoływany. tylko przechwytywanie load
może być wywołane, ale ze względu na obciążenie pod-zasób, jak arkusz stylów, nie ze względu na obciążenie samego dokumentu.
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
};
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-31 21:33:18
W Chrome, Okno.onload różni się od <body onload="">
, podczas gdy są one takie same zarówno w Firefoksie (wersja 35.0), jak i IE (Wersja 11).
Możesz to zbadać za pomocą następującego fragmentu:
<!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>
I zobaczysz zarówno " window loaded "(który pojawia się najpierw), jak i" body onload " w konsoli Chrome. Jednak zobaczysz po prostu "body onload" w Firefoksie i IE. Jeśli uruchomisz "window.onload.toString()
" w konsolach IE & FF, zobaczysz:
"function onload (event) { bodyOnloadHandler() }"
Co oznacza, że przypisanie " okno.onload = function(e)..."jest nadpisane.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-26 04:08:11
window.onload
i onunload
są skrótami do document.body.onload
i document.body.onunload
document.onload
i onload
Obsługa wszystkich tagów html wydaje się być zarezerwowana, jednak nigdy nie wywołana
'onload
' w dokumencie - > true
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-16 06:50:08
Okno.onload jednak często są to samo. Podobnie ciało.onload staje się oknem.onload w IE.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-25 21:47:20
Okno.onload jest jednak standardem - przeglądarka internetowa w PS3 (oparta na Netfront) nie obsługuje obiektu window, więc nie można go tam używać.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-19 11:31:31
W skrócie
-
window.onload
is not supported by IE 6-8 -
document.onload
nie jest obsługiwana przez żadną nowoczesną przeglądarkę (zdarzenie nigdy nie jest wywoływane)
window.onload = () => console.log('window.onload works'); // fired
document.onload = () => console.log('document.onload works'); // not fired
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-27 20:50:58