Który jest szerzej obsługiwany: window.onload
lub document.onload
?
javascript
event-handling
dom-events
Chris Ballance
źródło
źródło
window
zdarzenia:onload
iDOMContentLoaded
. Przykład użycia :,window.addEventListener('DOMContentLoaded', callback)
. Od połowy 2019 r. Kompatybilny ze wszystkimi głównymi przeglądarkami. ----- developer.mozilla.org/en-US/docs/Web/API/Window/… ------ developer.mozilla.org/en-US/docs/Web/API/Window/load_eventwindow.onload
idocument.onload
są odmienne od siebie!window.onload
wydaje się mieć miejsce później i ma trochę więcej załadowania niżdocument.onload
! (Niektóre rzeczy działają z oknem, które nie działa z dokumentem! Dotyczy to także dokumentu.Odpowiedzi:
Kiedy strzelają?
window.onload
W niektórych przeglądarkach przejmuje teraz rolę
document.onload
i uruchamia się, gdy DOM jest również gotowy.document.onload
Jak dobrze są obsługiwane?
window.onload
wydaje się być najczęściej wspierany. W rzeczywistości niektóre z najnowocześniejszych przeglądarek zostały w pewnym sensie zastąpionedocument.onload
przezwindow.onload
.Problemy z obsługą przeglądarki są najprawdopodobniej powodem, dla którego wiele osób zaczyna korzystać z bibliotek takich jak jQuery do obsługi sprawdzania, czy dokument jest gotowy:
Dla celów historii.
window.onload
vsbody.onload
:źródło
window.onload
i<body onload="">
która jest zupełnie inna (i „oddzielna struktura z akcji” sprawia, że o wiele więcej sensu w tym kontekście). Nie chodzi o to, że odpowiedź jest zła, ale jej podstawą jest.document.onload
JS jest równoważne z jQuerydocument.ready
?Ogólna idea jest, że pożary window.onload gdy okno Dokument jest gotowy do prezentacji i document.onload pożarów , gdy drzewa DOM (zbudowany z kodu znaczników w dokumencie) jest zakończona .
Idealnie, subskrybowanie zdarzeń drzewa DOM , pozwala na manipulowanie poza ekranem za pomocą Javascript, nie powodując prawie żadnego obciążenia procesora . Przeciwnie, uruchomienie
window.onload
może zająć trochę czasu , gdy wiele zewnętrznych zasobów musi być jeszcze wymaganych, przeanalizowanych i załadowanych.► Scenariusz testowy:
Aby zaobserwować różnicę i sposób, w jaki wybrana przeglądarka implementuje wyżej wymienione procedury obsługi zdarzeń , wystarczy wstawić następujący kod w
<body>
znaczniku - - dokumentu .► Wynik:
Oto wynikowe zachowanie, które można zaobserwować w przeglądarce Chrome v20 (i prawdopodobnie w większości obecnych przeglądarek).
document.onload
zdarzeniaonload
odpala dwa razy, gdy zostanie zadeklarowany w środku<body>
, raz, gdy zostanie zadeklarowany w środku<head>
(gdzie zdarzenie działa jakdocument.onload
).window.onload
moduł obsługi zdarzeń w ramach<head>
elementu HTML .►Przykładowy projekt:
Powyższy kod pochodzi z bazy kodu tego projektu (
index.html
ikeyboarder.js
).Aby uzyskać listę procedur obsługi zdarzeń obiektu okna , zapoznaj się z dokumentacją MDN.
źródło
Dodaj detektor zdarzeń
Update March 2017
1 Waniliowy JavaScript
2 jQuery
Powodzenia.
źródło
window.addEventListener('load', function() {...})
. Zaktualizowałem również moją odpowiedź.Według dokumentów Parsing HTML - Koniec ,
Przeglądarka analizuje źródło HTML i uruchamia odroczone skrypty.
A
DOMContentLoaded
jest wysyłane w momencie,document
gdy cały HTML został przeanalizowany i uruchomiony. Wydarzenie przechodzi dowindow
.Przeglądarka ładuje zasoby (takie jak obrazy), które opóźniają ładowanie zdarzenia.
load
Zdarzenie jest wywoływane uwindow
.Dlatego kolejność wykonywania będzie
DOMContentLoaded
detektory zdarzeńwindow
w fazie przechwytywaniaDOMContentLoaded
słuchacze wydarzeń zdocument
DOMContentLoaded
nasłuchiwanie zdarzeńwindow
w fazie bubbleload
detektory zdarzeń (w tymonload
moduł obsługi zdarzeń) zwindow
Nie należy nigdy wywoływać
load
detektora zdarzeń bąbelkowych (w tymonload
modułu obsługi zdarzeń)document
.load
Wywoływane mogą być tylko detektory przechwytywania , ale z powodu obciążenia zasobu podrzędnego, takiego jak arkusz stylów, nie z powodu obciążenia samego dokumentu.źródło
document - load - capture
rzeczywiście tak się dzieje, co jest sprzeczne z tym, czego oczekiwałem podczas wyszukiwania, dlaczego ładowanie dokumentów nie ma miejsca dla mnie. Dziwnie, jest to niespójne. Czasami się pojawia, czasem nie, czasem pojawia się dwa razy - ale nigdy się niedocument - load - bubble
zdarza. Sugerowałbym nie używaćdocument load
.load
zdarzenie jest wysyłane na zasoby zewnętrzne. To zdarzenie nie powoduje bąbelkowania, więc zwykle nie jest wykrywane w dokumencie, ale powinno być w fazie przechwytywania. Te wpisy odnoszą się do obciążenia elementów<style>
i<script>
. Myślę, że Edge nadaje się do ich wyświetlania, a Firefox i Chrome się mylą.useCapture
opcja nauczyła mnie czegoś nowego.W Chrome window.onload różni się od
<body onload="">
, podczas gdy są one takie same zarówno w przeglądarce Firefox (wersja 35.0), jak i IE (wersja 11).Możesz to zbadać za pomocą następującego fragmentu:
W konsoli Chrome zobaczysz zarówno „okno załadowane” (które pojawia się na początku), jak i „body onload”. Jednak w Firefoksie i IE zobaczysz tylko „obciążenie ciała”. Jeśli uruchomisz „
window.onload.toString()
” w konsolach IE i FF, zobaczysz:co oznacza, że przypisanie „window.onload = function (e) ...” zostało zastąpione.
źródło
window.onload
ionunload
są skrótami dodocument.body.onload
idocument.body.onunload
document.onload
ionload
procedura obsługi wszystkich znaczników HTML wydaje się być zarezerwowana, ale nigdy nie została uruchomiona'
onload
' w dokumencie -> prawdaźródło
window.onload jednak często są takie same. Podobnie body.onload zmienia się w window.onload w IE.
źródło
Window.onload jest jednak standardem - przeglądarka internetowa w PS3 (oparta na Netfront) nie obsługuje obiektu okna, więc nie można go tam używać.
źródło
W skrócie
windows.onload
nie jest obsługiwany przez IE 6-8document.onload
nie jest obsługiwany przez żadną nowoczesną przeglądarkę (wydarzenie nigdy nie jest uruchamiane)Pokaż fragment kodu
źródło