Каковы различия между методами JavaScript window.onload
и jQuery $(document).ready()
?
$().ready()
делает его огонь после того, как window.onload
время от времени.
Каковы различия между методами JavaScript window.onload
и jQuery $(document).ready()
?
$().ready()
делает его огонь после того, как window.onload
время от времени.
Ответы:
ready
Событие происходит после того, как был загружен HTML документ, в то время как onload
событие происходит позже, когда все содержимое (например , изображения) , также был загружен.
onload
Событие является стандартным событием в DOM, в то время как ready
событие является специфическим для JQuery. Цель этого ready
события состоит в том, что оно должно произойти как можно раньше после загрузки документа, чтобы коду, который добавляет функциональность к элементам на странице, не приходилось ждать загрузки всего содержимого.
ready
Событие является специфичны для JQuery. Он использует DOMContentLoaded
событие, если оно доступно в браузере, иначе оно эмулирует его. В DOM нет точного эквивалента, потому что DOMContentLoaded
событие поддерживается не во всех браузерах.
onload
. onload
это имя свойства объекта, в котором хранится функция, которая будет вызвана при запуске load
события.
window.onload
является встроенным событием JavaScript, но поскольку его реализация имеет тонкие причуды в разных браузерах (Firefox, Internet Explorer 6, Internet Explorer 8 и Opera ), jQuery предоставляет document.ready
, который абстрагирует их и запускает, как только DOM страницы готов (не ждет изображений и т. д.).
$(document).ready
(обратите внимание, что это не так document.ready
, что не определено) - это функция jQuery, которая упаковывает и обеспечивает согласованность для следующих событий:
document.ondomcontentready
/ document.ondomcontentloaded
- новое событие, которое возникает при загрузке DOM документа (это может произойти за некоторое время до загрузки изображений и т. д.); опять же, немного отличается в Internet Explorer и в остальном миреwindow.onload
(который реализован даже в старых браузерах), который запускается, когда загружается вся страница (изображения, стили и т. д.)load
событиеwindow
реализовано достаточно последовательно во всех браузерах. Упомянутая вами проблема, которую пытаются решить jQuery и другие библиотеки, заключается в том, что load
событие не запускается до тех пор, пока не будут загружены все зависимые ресурсы, такие как изображения и таблицы стилей, что может занять длительное время после полной загрузки DOM. предоставлены и готовы к взаимодействию. Вызывается событие, которое вызывается в большинстве браузеров, когда DOM готов DOMContentLoaded
, а не DOMContentReady
.
onload
(есть различия по FF / IE / Opera). Что касается DOMContentLoaded
, вы совершенно правы. Редактирование, чтобы уточнить.
document.onload
было пользоваться). Что касается window.onload: window.onload = fn1;window.onload=fn2;
- только fn2 будет вызываться при загрузке. Некоторые бесплатные веб-хосты вставляют свой собственный код в документы, а иногда это затормаживает код на странице.
$(document).ready()
это событие jQuery $(document).ready()
Метод JQuery вызывается, как только DOM готов (это означает, что браузер проанализировал HTML и построил дерево DOM). Это позволяет вам запускать код, как только документ готов к работе.
Например, если браузер поддерживает событие DOMContentLoaded (как это делают многие браузеры, отличные от IE), то это событие сработает. (Обратите внимание, что событие DOMContentLoaded было добавлено только в IE в IE9 +.)
Для этого можно использовать два синтаксиса:
$( document ).ready(function() {
console.log( "ready!" );
});
Или сокращенная версия:
$(function() {
console.log( "ready!" );
});
Основные моменты для $(document).ready()
:
$
наjQuery
когда вы получите «$ не определено».$(window).load()
вместо этого. window.onload()
родная функция JavaScript В window.onload()
событии срабатывает , когда все содержимое на странице загрузится, в том числе DOM (Document Object Model), рекламных баннеров и изображений. Другое различие между ними состоит в том, что, хотя у нас может быть более одной $(document).ready()
функции, у нас может быть только одна onload
функция.
Нагрузки Windows , срабатывает событие , когда все содержимое на странице полностью нагруженные включая DOM (Document Object Model) содержание и асинхронные JavaScript , кадры и изображения . Вы также можете использовать body onload =. Оба одинаковы; window.onload = function(){}
и <body onload="func();">
есть разные способы использования одного и того же события.
$document.ready
Событие функции jQuery выполняется немного раньше window.onload
и вызывается после загрузки DOM (объектной модели документа) на вашу страницу. Он не будет ждать, пока изображения, кадры полностью загрузятся .
Взятые из следующей статьи:
как $document.ready()
отличается отwindow.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>
Слово предостережения при использовании $(document).ready()
с Internet Explorer. Если HTTP-запрос прерывается до загрузки всего документа (например, во время потоковой передачи страницы в браузер по другой ссылке) IE запустит $(document).ready
событие.
Если какой-либо код в $(document).ready()
событии ссылается на объекты DOM, существует вероятность того, что эти объекты не будут найдены, и могут возникнуть ошибки Javascript. Либо защищайте ваши ссылки на эти объекты, либо откладывайте код, который ссылается на эти объекты, на событие window.load.
Я не смог воспроизвести эту проблему в других браузерах (в частности, Chrome и Firefox)
Всегда используйте, window.addEventListener
чтобы добавить событие в окно. Потому что таким образом вы можете выполнить код в разных обработчиках событий.
Правильный код:
window.addEventListener('load', function () {
alert('Hello!')
})
window.addEventListener('load', function () {
alert('Bye!')
})
Неверный код:
window.onload = function () {
alert('Hello!') // it will not work!!!
}
window.onload = function () {
alert('Bye!')
}
Это потому, что onload - это просто свойство объекта, которое перезаписывается.
По аналогии с addEventListener
ним лучше использовать $(document).ready()
, чем загружать.
$(document).on('ready', handler)
привязывается к готовому событию из jQuery. Обработчик вызывается при загрузке DOM . Активы как изображения, возможно, все еще отсутствуют . Он никогда не будет вызван, если документ готов во время привязки. Для этого jQuery использует DOMContentLoaded -Event, эмулируя его, если он недоступен.
$(document).on('load', handler)
это событие, которое будет запущено после загрузки всех ресурсов с сервера. Изображения загружены сейчас. В то время как onload является необработанным событием HTML, готовое построено с помощью jQuery.
$(document).ready(handler)
на самом деле это обещание . Обработчик будет вызван немедленно, если документ готов во время вызова. В противном случае он привязывается к ready
событию.
Перед JQuery 1.8 , $(document).load(handler)
существует в качестве псевдонима для $(document).on('load',handler)
.
$.fn.load
что больше не ведёт себя как связующее звено событий. На самом деле, он устарел начиная с jquery 1.8. Я обновил его соответственно
$(document).ready()
Является JQuery событие , которое происходит , когда HTML документ был полностью загружен, в то время как window.onload
событие происходит позже, когда все , в том числе изображения на странице загружен.
Кроме того, window.onload - это явное событие javascript в DOM, а $(document).ready()
событие - метод в jQuery.
$(document).ready()
обычно это оболочка для jQuery, чтобы убедиться, что все загруженные элементы используются в jQuery ...
Посмотрите на исходный код jQuery, чтобы понять, как он работает:
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;
};
Также я создал изображение ниже как краткий справочник для обоих:
window.onload: обычное событие JavaScript.
document.ready: конкретное событие jQuery, когда весь HTML был загружен.
Одна вещь, которую нужно помнить (или я должен сказать, вспомнить), это то, что вы не можете сложить, onload
как вы можете с ready
. Другими словами, jQuery magic позволяет использовать несколько ready
s на одной странице, но вы не можете сделать это с помощью onload
.
Последнее onload
отменит любые предыдущие onload
s.
Хороший способ справиться с этим - использовать функцию, написанную, по-видимому, одним Саймоном Уиллисоном и описанную в разделе Использование нескольких функций загрузки 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
(событие jQuery) сработает, когда все элементы на месте, и на них можно ссылаться в коде JavaScript, но содержимое не обязательно загружается. Document.ready
выполняется, когда документ HTML загружен.
$(document).ready(function() {
// Code to be executed
alert("Document is ready");
});
window.load
Однако будет ждать страницы , чтобы быть полностью загружены. Это включает в себя внутренние рамки, изображения и т. Д.
$(window).load(function() {
//Fires when the page is loaded completely
alert("window is loaded");
});
Событие document.ready происходит, когда документ HTML был загружен, и window.onload
событие происходит всегда позже, когда весь контент (изображения и т. Д.) Был загружен.
Вы можете использовать это document.ready
событие, если хотите «рано» вмешаться в процесс рендеринга, не дожидаясь загрузки изображений. Если вам нужны изображения (или любой другой «контент»), прежде чем ваш скрипт «что-то сделает», вам нужно подождать, покаwindow.onload
.
Например, если вы реализуете шаблон «Слайд-шоу», и вам необходимо выполнить вычисления на основе размеров изображения, вы можете подождать, пока window.onload
. В противном случае вы можете столкнуться с некоторыми случайными проблемами в зависимости от скорости загрузки изображений. Ваш сценарий будет работать одновременно с потоком, который загружает изображения. Если ваш сценарий достаточно длинный или сервер достаточно быстрый, вы можете не заметить проблему, если изображения появляются вовремя. Но самая безопасная практика - загружать изображения.
document.ready
Это может быть хорошим событием для вас, чтобы показать пользователям знак «загрузка ...», и после window.onload
этого вы можете выполнить любой сценарий, для которого требовались загруженные ресурсы, и, наконец, удалить знак «Загрузка ...».
Примеры :-
// 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
это встроенная функция JavaScript window.onload
запуск при загрузке HTML-страницы. window.onload
может быть написано только один раз.
document.ready
является функцией библиотеки jQuery. document.ready
срабатывает, когда HTML и весь код JavaScript, CSS и изображения, включенные в файл HTML, полностью загружены.
document.ready
может быть написано несколько раз в соответствии с требованиями.
Когда вы говорите $(document).ready(f)
, вы говорите скриптовому движку сделать следующее:
$
и выберите его, поскольку он не находится в локальной области видимости, он должен выполнить поиск в хеш-таблице, которая может иметь или не иметь коллизии.ready
выбранного объекта, который включает в себя поиск другой хеш-таблицы в выбранном объекте, чтобы найти метод и вызвать его.В лучшем случае это 2 просмотра хеш-таблицы, но это игнорирует тяжелую работу, проделанную jQuery, где $
находится кухонный приемник всех возможных входных данных для jQuery, поэтому, скорее всего, существует другая карта для отправки запроса в правильный обработчик.
В качестве альтернативы, вы можете сделать это:
window.onload = function() {...}
который будет
onload
является ли свойство свойством или нет, выполнив поиск в хеш-таблице, поскольку он вызывается как функция.В лучшем случае, это требует поиска в одной хеш-таблице, что необходимо, потому что onload
нужно выбрать.
В идеале, jQuery должен компилировать свои запросы в строки, которые можно вставить для выполнения того, что вы хотели от jQuery, но без диспетчеризации jQuery во время выполнения. Таким образом, у вас есть возможность либо
eval
.window.onload предоставляется API-интерфейсом DOM и сообщает, что «событие загрузки запускается при загрузке данного ресурса».
«Событие загрузки происходит в конце процесса загрузки документа. На этом этапе все объекты в документе находятся в DOM, и все изображения, сценарии, ссылки и подкадры завершили загрузку». DOM onload
Но в jQuery $ (document) .ready () будет работать только после того, как страница Document Object Model (DOM) будет готова для выполнения кода JavaScript. Это не включает изображения, сценарии, фреймы и т. Д. Событие, готовое к jquery
Таким образом, метод jquery ready будет запущен раньше, чем событие dom onload.