Jakie są różnice między metodą JavaScript window.onload
a $(document).ready()
metodą jQuery ?
$().ready()
powoduje, że window.onload
czasami się uruchamia .
Jakie są różnice między metodą JavaScript window.onload
a $(document).ready()
metodą jQuery ?
$().ready()
powoduje, że window.onload
czasami się uruchamia .
Odpowiedzi:
ready
Zdarzenie po dokument HTML został załadowany, gdy onload
zdarzenie nastąpi później, kiedy cała zawartość (np zdjęć) również został załadowany.
onload
Wydarzenie jest standardowym zdarzenie w DOM, gdy ready
zdarzenie jest specyficzny dla jQuery. Celem tego ready
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.
ready
Wydarzenie jest specyficzny dla jQuery. Korzysta ze DOMContentLoaded
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 wyzwoleniu load
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 zapewnia document.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 jest document.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.)load
zdarzenie window
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, że load
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 gotowy DOMContentLoaded
, nie jest wywoływane DOMContentReady
.
onload
(istnieją różnice między FF / IE / Opera). Jeśli chodzi o DOMContentLoaded
, 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:
$( document ).ready(function() {
console.log( "ready!" );
});
Lub wersja skrócona:
$(function() {
console.log( "ready!" );
});
Główne punkty dla $(document).ready()
:
$
zjQuery
po odebraniu „$ nie jest zdefiniowana.”$(window).load()
zamiast tego. window.onload()
jest natywną funkcją JavaScript. W window.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ę.
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śniej window.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()
$(document).ready(function() {
// Executes when the HTML document is loaded and the DOM is ready
alert("Document is ready");
});
// .load() method deprecated from jQuery 1.8 onward
$(window).on("load", function() {
// Executes when complete page is fully loaded, including
// all frames, objects and images
alert("Window is loaded");
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
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)
Zawsze używajwindow.addEventListener
aby dodać zdarzenie do okna. Ponieważ w ten sposób można wykonać kod w różnych programach obsługi zdarzeń.
Poprawny kod:
window.addEventListener('load', function () {
alert('Hello!')
})
window.addEventListener('load', function () {
alert('Bye!')
})
Zły kod:
window.onload = function () {
alert('Hello!') // it will not work!!!
}
window.onload = function () {
alert('Bye!')
}
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ć.
$(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 .
$(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ę z ready
-Event.
Przed jQuery 1.8 , $(document).load(handler)
istniał jako alias $(document).on('load',handler)
.
$.fn.load
że nie zachowuje się już jako segregator zdarzeń. W rzeczywistości jest przestarzały od jquery 1.8. Zaktualizowałem go odpowiednio
Jest $(document).ready()
to zdarzenie jQuery , które występuje, gdy dokument HTML został w pełni załadowany, a window.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:
jQuery.ready.promise = function( obj ) {
if ( !readyList ) {
readyList = jQuery.Deferred();
// Catch cases where $(document).ready() is called after the browser event has already occurred.
// we once tried to use readyState "interactive" here, but it caused issues like the one
// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
if ( document.readyState === "complete" ) {
// Handle it asynchronously to allow scripts the opportunity to delay ready
setTimeout( jQuery.ready );
// Standards-based browsers support DOMContentLoaded
} else if ( document.addEventListener ) {
// Use the handy event callback
document.addEventListener( "DOMContentLoaded", completed, false );
// A fallback to window.onload, that will always work
window.addEventListener( "load", completed, false );
// If IE event model is used
} else {
// Ensure firing before onload, maybe late but safe also for iframes
document.attachEvent( "onreadystatechange", completed );
// A fallback to window.onload, that will always work
window.attachEvent( "onload", completed );
// If IE and not a frame
// continually check to see if the document is ready
var top = false;
try {
top = window.frameElement == null && document.documentElement;
} catch(e) {}
if ( top && top.doScroll ) {
(function doScrollCheck() {
if ( !jQuery.isReady ) {
try {
// Use the trick by Diego Perini
// http://javascript.nwbox.com/IEContentLoaded/
top.doScroll("left");
} catch(e) {
return setTimeout( doScrollCheck, 50 );
}
// detach all dom ready events
detach();
// and execute any waiting functions
jQuery.ready();
}
})();
}
}
}
return readyList.promise( obj );
};
jQuery.fn.ready = function( fn ) {
// Add the callback
jQuery.ready.promise().done( fn );
return this;
};
Również utworzyłem poniższy obraz jako szybkie odniesienia do obu:
window.onload: normalne zdarzenie JavaScript.
document.ready: Określone zdarzenie jQuery, gdy cały HTML został załadowany.
Jedną rzeczą do zapamiętania (lub powinienem powiedzieć, przypomnieć) jest to, że nie możesz układać onload
tak, jak możesz ready
. Innymi słowy, magia jQuery pozwala na wiele ready
s na tej samej stronie, ale nie możesz tego zrobić onload
.
Ostatni onload
unieważni wszelkie poprzednie onload
.
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 .
function addLoadEvent(func) {
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = func;
}
else {
window.onload = function() {
if (oldonload) {
oldonload();
}
func();
}
}
}
// Example use:
addLoadEvent(nameOfSomeFunctionToRunOnPageLoad);
addLoadEvent(function() {
/* More code to run on page load */
});
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.
$(document).ready(function() {
// Code to be executed
alert("Document is ready");
});
window.load
Jednak będzie czekać na stronę, aby być w pełni załadowany. Obejmuje to ramki wewnętrzne, obrazy itp.
$(window).load(function() {
//Fires when the page is loaded completely
alert("window is loaded");
});
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óźniej window.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:
// document ready events
$(document).ready(function(){
alert("document is ready..");
})
// using JQuery
$(function(){
alert("document is ready..");
})
// window on load event
function myFunction(){
alert("window is loaded..");
}
window.onload = myFunction;
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.
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ć:
window.onload = function() {...}
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
.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.