Jakie są różnice między metodą JavaScript window.onload
a $(document).ready()
metodą jQuery ?
javascript
jquery
dom-events
unobtrusive-javascript
Vaibhav Jain
źródło
źródło
$().ready()
powoduje, żewindow.onload
czasami się uruchamia .Odpowiedzi:
ready
Zdarzenie po dokument HTML został załadowany, gdyonload
zdarzenie nastąpi później, kiedy cała zawartość (np zdjęć) również został załadowany.onload
Wydarzenie jest standardowym zdarzenie w DOM, gdyready
zdarzenie jest specyficzny dla jQuery. Celem tegoready
zdarzenia jest to, że powinno ono nastąpić jak najwcześniej po załadowaniu dokumentu, aby kod, który dodaje funkcjonalność do elementów na stronie, nie musiał czekać na załadowanie całej zawartości.źródło
ready
Wydarzenie jest specyficzny dla jQuery. Korzysta zeDOMContentLoaded
zdarzenia, jeśli jest dostępne w przeglądarce, w przeciwnym razie je emuluje. W DOM nie ma dokładnego odpowiednika, ponieważDOMContentLoaded
zdarzenie nie jest obsługiwane we wszystkich przeglądarkach.onload
.onload
jest nazwą właściwości obiektu, która przechowuje funkcję, która ma zostać wywołana po wyzwoleniuload
zdarzenia.window.onload
jest wbudowanym zdarzeniem JavaScript, ale ponieważ jego implementacja miała subtelne dziwactwa w różnych przeglądarkach (Firefox, Internet Explorer 6, Internet Explorer 8 i Opera ), jQuery zapewniadocument.ready
, który je oddziela i uruchamia się, gdy tylko DOM strony będzie gotowy (nie czeka na obrazy itp.).$(document).ready
(zauważ, że nie jestdocument.ready
, co jest niezdefiniowane) to funkcja jQuery, która zawija i zapewnia spójność następujących zdarzeń:document.ondomcontentready
/document.ondomcontentloaded
- nowe zdarzenie, które jest uruchamiane po załadowaniu DOM dokumentu (może minąć trochę czasu, zanim obrazy zostaną załadowane itp.); znowu nieco inaczej w Internet Explorerze i reszcie światawindow.onload
(który jest zaimplementowany nawet w starych przeglądarkach), który jest uruchamiany, gdy ładuje się cała strona (obrazy, style itp.)źródło
load
zdarzeniewindow
jest wdrażane w miarę konsekwentnie we wszystkich przeglądarkach. Problem, który jQuery i inne biblioteki próbują rozwiązać, to ten, o którym wspomniałeś, to znaczy, żeload
zdarzenie nie jest uruchamiane, dopóki wszystkie zależne zasoby, takie jak obrazy i arkusze stylów nie zostaną załadowane, co może potrwać długo po całkowitym załadowaniu DOM, renderowane i gotowe do interakcji. Zdarzenie uruchamiane w większości przeglądarek, gdy DOM jest gotowyDOMContentLoaded
, nie jest wywoływaneDOMContentReady
.onload
(istnieją różnice między FF / IE / Opera). Jeśli chodzi oDOMContentLoaded
, masz całkowitą rację. Edycja w celu wyjaśnienia.document.onload
był użyteczny). Jeśli chodzi o window.onload:window.onload = fn1;window.onload=fn2;
- tylko fn2 zostanie wywołane onload. Niektóre darmowe hosty internetowe wstawiają swój własny kod do dokumentów, a czasem blokuje to kod strony.$(document).ready()
jest zdarzeniem jQuery. JQuery's$(document).ready()
Metoda zostaje wywołana, gdy tylko DOM jest gotowy (co oznacza, że przeglądarka przeanalizowała HTML i zbudowała drzewo DOM). Umożliwia to uruchomienie kodu, gdy tylko dokument będzie gotowy do manipulacji.Na przykład, jeśli przeglądarka obsługuje zdarzenie DOMContentLoaded (tak jak robi to wiele przeglądarek innych niż IE), uruchomi się w przypadku tego zdarzenia. (Uwaga: zdarzenie DOMContentLoaded zostało dodane tylko do IE w IE9 +).
Można do tego użyć dwóch składni:
Lub wersja skrócona:
Główne punkty dla
$(document).ready()
:$
zjQuery
po odebraniu „$ nie jest zdefiniowana.”$(window).load()
zamiast tego.window.onload()
jest natywną funkcją JavaScript. Wwindow.onload()
Zdarzenie gdy wszystkie treści na swojej stronie załadowaniu tym DOM (Document Object Model), banerów reklamowych i obrazów. Kolejna różnica między nimi polega na tym, że chociaż możemy mieć więcej niż jedną$(document).ready()
funkcję, możemy mieć tylko jednąonload
funkcję.źródło
Obciążenie systemu Windows Zdarzenie gdy wszystkie treści na stronie jest w pełni załadowany w tym DOM (Document Object Model) treści i Asynchronous JavaScript , ramek i obrazów . Możesz także użyć body onload =. Oba są takie same;
window.onload = function(){}
i<body onload="func();">
są różne sposoby korzystania z tego samego wydarzenia.$document.ready
Zdarzenie funkcji jQuery wykonuje się nieco wcześniejwindow.onload
i jest wywoływane po załadowaniu DOM (modelu obiektowego dokumentu) na twoją stronę. Nie będzie czekać na pełne załadowanie obrazów, ramek .Zrobione z następującym artykule: Jak
$document.ready()
różni się odwindow.onload()
źródło
źródło
Uwaga dotycząca korzystania
$(document).ready()
z Internet Explorera. Jeśli żądanie HTTP zostanie przerwane przed załadowaniem całego dokumentu (na przykład, gdy strona jest przesyłana strumieniowo do przeglądarki, klikane jest inne łącze) IE wyzwoli$(document).ready
zdarzenie.Jeśli jakikolwiek kod w
$(document).ready()
zdarzeniu odwołuje się do obiektów DOM, istnieje możliwość, że obiekty te nie zostaną odnalezione i mogą wystąpić błędy JavaScript. Zabezpiecz swoje odwołania do tych obiektów lub odrocz kod, który odwołuje te obiekty do zdarzenia window.load.Nie udało mi się odtworzyć tego problemu w innych przeglądarkach (w szczególności Chrome i Firefox)
źródło
Mała wskazówka:
Zawsze używaj
window.addEventListener
aby dodać zdarzenie do okna. Ponieważ w ten sposób można wykonać kod w różnych programach obsługi zdarzeń.Poprawny kod:
Zły kod:
Wynika to z faktu, że onload jest po prostu właściwością obiektu, który jest nadpisywany.
Przez analogię
addEventListener
lepiej jest używać$(document).ready()
zamiast obciążać.źródło
Wydarzenia
$(document).on('ready', handler)
wiąże się z gotowym zdarzeniem z jQuery. Program obsługi jest wywoływany podczas ładowania DOM . Brakuje zasobów takich jak obrazy . Nigdy nie zostanie wywołany, jeśli dokument jest gotowy w momencie wiązania. jQuery używa do tego DOMContentLoaded -Event, emulując go, jeśli nie jest dostępny.$(document).on('load', handler)
to zdarzenie, które zostanie uruchomione po załadowaniu wszystkich zasobów z serwera. Obrazy są teraz ładowane. Podczas gdy onload jest nieprzetworzonym zdarzeniem HTML, jest gotowe jQuery buduje .Funkcje
$(document).ready(handler)
jest obietnicą . Program obsługi zostanie wywołany natychmiast, jeśli dokument będzie gotowy w momencie wywołania. W przeciwnym razie wiąże się zready
-Event.Przed jQuery 1.8 ,
$(document).load(handler)
istniał jako alias$(document).on('load',handler)
.Dalsza lektura
źródło
$.fn.load
że nie zachowuje się już jako segregator zdarzeń. W rzeczywistości jest przestarzały od jquery 1.8. Zaktualizowałem go odpowiednioJest
$(document).ready()
to zdarzenie jQuery , które występuje, gdy dokument HTML został w pełni załadowany, awindow.onload
zdarzenie występuje później, gdy wszystko, łącznie z obrazami na stronie, jest załadowane.Również window.onload jest czystym zdarzeniem javascript w DOM, podczas gdy
$(document).ready()
zdarzenie jest metodą w jQuery.$(document).ready()
jest zwykle opakowaniem dla jQuery, aby upewnić się, że wszystkie załadowane elementy będą używane w jQuery ...Spójrz na kod źródłowy jQuery, aby zrozumieć, jak to działa:
Również utworzyłem poniższy obraz jako szybkie odniesienia do obu:
źródło
window.onload: normalne zdarzenie JavaScript.
document.ready: Określone zdarzenie jQuery, gdy cały HTML został załadowany.
źródło
Jedną rzeczą do zapamiętania (lub powinienem powiedzieć, przypomnieć) jest to, że nie możesz układać
onload
tak, jak możeszready
. Innymi słowy, magia jQuery pozwala na wieleready
s na tej samej stronie, ale nie możesz tego zrobićonload
.Ostatni
onload
unieważni wszelkie poprzednieonload
.Dobrym sposobem na poradzenie sobie z tym jest funkcja najwyraźniej napisana przez jednego Simona Willisona i opisana w Korzystanie z wielu funkcji ładowania JavaScript .
źródło
Document.ready
(zdarzenie jQuery) zostanie uruchomione, gdy wszystkie elementy będą na swoim miejscu, i można do nich odwoływać się w kodzie JavaScript, ale treść niekoniecznie jest ładowana.Document.ready
wykonuje się po załadowaniu dokumentu HTML.window.load
Jednak będzie czekać na stronę, aby być w pełni załadowany. Obejmuje to ramki wewnętrzne, obrazy itp.źródło
Zdarzenie document.ready ma miejsce po załadowaniu dokumentu HTML, a plik
window.onload
zdarzenie występuje zawsze później, gdy cała zawartość (obrazy itp.) załadowana.Możesz użyć
document.ready
zdarzenia, jeśli chcesz interweniować „wcześnie” w procesie renderowania, bez czekania na załadowanie obrazów. Jeśli potrzebujesz obrazów (lub innej „treści”), zanim skrypt „coś zrobi”, musisz poczekaćwindow.onload
.Na przykład, jeśli wdrażasz wzór „Pokaz slajdów” i musisz wykonać obliczenia na podstawie rozmiarów obrazu, możesz poczekać, aż
window.onload
. W przeciwnym razie mogą wystąpić pewne losowe problemy, w zależności od szybkości ładowania obrazów. Skrypt działałby równolegle z wątkiem ładującym obrazy. Jeśli twój skrypt jest wystarczająco długi lub serwer jest wystarczająco szybki, możesz nie zauważyć problemu, jeśli zdarzy się, że obrazy dotrą na czas. Ale najbezpieczniejszą praktyką byłoby ładowanie zdjęć.document.ready
może być miłym wydarzeniem dla Ciebie, aby pokazać użytkownikom znak „ładowanie ...” i późniejwindow.onload
, a następnie możesz ukończyć wszelkie skrypty wymagające załadowanych zasobów, a następnie ostatecznie usunąć znak „Ładowanie ...”.Przykłady:
źródło
window.onload
jest wbudowaną funkcją JavaScript.window.onload
wyzwalane po załadowaniu strony HTML.window.onload
można napisać tylko raz.document.ready
jest funkcją biblioteki jQuery.document.ready
wyzwala się, gdy HTML i cały kod JavaScript, CSS i obrazy zawarte w pliku HTML są całkowicie załadowane.document.ready
może być napisane wiele razy zgodnie z wymaganiami.źródło
Kiedy mówisz
$(document).ready(f)
, każesz silnikowi skryptowemu wykonać następujące czynności:$
i wybierz go, ponieważ nie znajduje się on w zasięgu lokalnym, musi przeprowadzić wyszukiwanie tablicy skrótów, która może, ale nie musi mieć kolizji.ready
wybranego obiektu, które obejmuje kolejne wyszukiwanie tablicy skrótów w wybranym obiekcie w celu znalezienia metody i wywołania jej.W najlepszym przypadku są to 2 wyszukiwania tabeli skrótów, ale ignoruje to ciężką pracę wykonaną przez jQuery, gdzie
$
jest zlew kuchenny wszystkich możliwych danych wejściowych do jQuery, więc inna mapa prawdopodobnie wyśle zapytanie do poprawnego modułu obsługi.Alternatywnie możesz to zrobić:
które będą
onload
jest właściwością, czy nie, wykonując wyszukiwanie tablicy skrótów, ponieważ jest ona wywoływana jak funkcja.W najlepszym przypadku kosztuje to pojedyncze wyszukiwanie tabeli skrótów, co jest konieczne, ponieważ
onload
musi zostać pobrane.Idealnie byłoby, gdyby jQuery skompilowałoby swoje zapytania do ciągów znaków, które można wkleić, aby zrobić to, co chcesz, aby jQuery było wykonywane, ale bez wysyłania przez jQuery środowiska wykonawczego. W ten sposób masz opcję albo
eval
.źródło
Window.onload jest dostarczane przez interfejs API DOM i mówi „zdarzenie load uruchamia się, gdy załadowany zostanie dany zasób”.
„Zdarzenie ładowania uruchamia się na końcu procesu ładowania dokumentu. W tym momencie wszystkie obiekty w dokumencie znajdują się w DOM, a wszystkie obrazy, skrypty, łącza i podramki zostały zakończone.” Obciążenie DOM
Ale w jQuery $ (document) .ready () będzie działać tylko wtedy, gdy strona Document Object Model (DOM) jest gotowa do uruchomienia kodu JavaScript. Nie obejmuje to obrazów, skryptów, ramek iframe itp. Zdarzenie gotowości jquery
Tak więc metoda gotowości jquery będzie działać wcześniej niż zdarzenie dom onload.
źródło