Подтвердить что ты не робот

Должен ли этот код находиться в документе. Уже?

document.ready используется для выполнения кода после полной загрузки DOM. Это можно использовать для прикрепления обработчиков событий к элементам на странице, например.

$(function(){ 
    $('#somediv').click(function(){ 

    }); 
}) 

<div id="somediv"> </div> 

Внутри jQuery подключается к DOMContentLoaded и window.onload в качестве резервной копии. В случае IE делается попытка прокрутить область просмотра снова и снова до тех пор, пока не будет успешно.

У меня есть несколько вопросов, первый мой, когда привязывайте обработчики событий к самому document, нужно ли поместить этот код в document.ready? Я всегда писал код ниже, не обернув его в document.ready

$(document).keydown(function(e){
    if (e.which == 39) { 
       alert( "right arrow pressed" );
       return false;
    }
});

И как вы можете видеть, это работает. Я понимаю, так как этот код не подключается к каким-либо элементам документа, но сам документ, нет необходимости обертывать его в обработчик document.ready. Другая причина, по которой я не обертываю это, - это то, что я использовал то же самое в vanilla javascript, эквивалентом которого был бы код ниже, который также работает.

document.onkeydown= function(){
var keyCode = event.keyCode || event.which;   
    if (keyCode == 39) { 
       alert( "right arrow pressed" );
       return false;
    }
}

Я видел многочисленные сообщения, где люди обертывают его в document.ready, есть ли недостаток в том, чтобы не обернуть этот код в document.ready?

Также я думаю, что этот вопрос связан с моей недостаточной ясностью того, что происходит в это время, когда DOM строится, поэтому, если кто-то может объяснить, что происходит в течение периода непосредственно перед тем, как DOM готов. Для меня документ готов, когда html был проанализирован и преобразован в дерево DOM, или ему еще больше?

Вкратце, вот мои вопросы

  • При привязке обработчиков событий к document, это   необходимо поместить этот код в document.ready.
  • Есть ли недостатки, чтобы не обертывать код в document.ready?
  • Какая последовательность событий имеет место, когда документ создается, перед запуском document.ready?
4b9b3361

Ответ 1

Если вы привязываетесь к самому документу, вам не нужно ждать, пока он будет готов. Не должно быть никаких недостатков, чтобы не обернуть его в document.ready в этом случае.

document.ready запускается, когда событие DOMReady запускается браузером или когда конкретный тест выполняется для версий браузеров, которые не поддерживают событие DOMReady.

Дополнительная информация. (5/22/12)

В большинстве современных браузеров реализовано событие DOMContentLoaded, которое срабатывает, когда все элементы, определенные в документе, готовы к обработке с помощью javascript. Другие браузеры полагаются только на цикл setTimeout, который непрерывно проверяет readistate документа или связывается непосредственно с методом onreadystatechanged документа (взятым из jquery core). Сам документ готов к обработке до того, как javascript будет выполнен, поэтому вам не нужно ждать, когда привязывается непосредственно к документу.

Единственная проблема заключается в том, что если код взаимодействует с элементами, отличными от документа, есть вероятность, что событие может быть инициировано в документе до того, как эти элементы будут существовать. Очень маловероятно, чтобы это произошло, но это может произойти. Если это то, что может произойти с вашим кодом, тогда имеет смысл разместить его внутри $(document).ready(), чтобы предотвратить этот сценарий. Ваш образец не гарантирует размещения внутри $(document).ready().

Ответ 2

Точкой $(document).ready является выполнение кода после анализа всего документа.

Вам нужно использовать его только в том случае, если вы хотите использовать элементы, которые еще не существуют.
(например, если ваш script находится в <head>)

Если элементы, которые вы используете, уже существуют (либо потому, что они глобальны, либо потому, что ваш <script> находится ниже них), вам это не нужно.

Ответ 3

Единственным недостатком отсутствия привязки события к документу в блоке document.ready было бы то, что можно будет запустить событие до того, как будет загружено все содержимое страницы, что может быть не таким, каким вы хотите.

Ответ 4

Это событие запускается, когда иерархия DOM полностью построенный, т.е. все активы , такие как изображения, были полностью получен.

Вы спросили:

  • При привязке обработчиков событий к самому документу, нужно ли поместить этот код в document.ready?
    • Ответ: Нет. При использовании кода, который полагается на значение свойств стиля CSS, важно ссылаться на внешние таблицы стилей или элементы стиля встраивания перед ссылкой на script, в котором находится ваш код или перед блоком document.ready().

  • Есть ли недостатки, чтобы не обертывать код в документе.
    • Ответ: Нет. Но когда вы должны создавать элементы в своих документах с помощью JavaScript, то следует ждать ради, пока ваш DOM не будет готов. Для этого вы должны поместить свой код внутри блока document.ready().

  • Какая последовательность событий имеет место, когда документ создается, непосредственно перед запуском document.ready?
    • Ответ. Перед тем как document.ready будет запущен, DOMContentLoaded уже запущен браузером.

Ответ 5

При использовании действий для элементов или их вызова (которые будут сгенерированы в DOM или еще не существуют) вам нужно использовать $(document).ready

Ответ 6

В дополнение к ответам: вы можете просто использовать функцию jquery live (вместо keydown и т.д.), чтобы освободиться от ситуации "элементы DOM должны быть закончены".

Итак, следующее должно работать правильно:

$( "#somediv" ).live( 'keydown', function(){ ... } );

В этом случае jQuery связывает событие, когда это возможно. У вас нет боли, чтобы поместить все привязки в одну (готовую) функцию, ваши привязки можно поместить в независимые части вашей HTML-страницы или файлов Javascript.

Итак, ответ на результат: no, вам не нужно размещать свой код в документе. Уже при использовании указанной функции.

Обновление

В последних версиях jQuery ( >= 1.7) используйте on() вместо live(), потому что последний лишен. Таким образом, нет необходимости помещать привязки событий в ready().

Ответ 7

1. При привязке обработчиков событий к самому документу необходимо ли поместить этот код в document.ready?

Нет. Фактически, методы 'on' для привязки в JQ могут делегировать в документе, чтобы вы могли в любое время использовать их в любом элементе, если не было много барботажа, останавливающегося в элементах контейнера с stopPropagation.

2. Есть ли недостатки, чтобы не обертывать код в документе. Уже?

Только те скрипты в голове могут попытаться ударить HTML, которого еще нет. Обратное заключается в том, что HTML может быть готов и получать события от пользователя перед документом. См. Методы 'on' или делегирование событий Google за то, что вы используете ваш торт и едите его там, где происходят события (оговорка - это библиотеки, которые глупо используют stopPropagation). document.ready - это всего лишь способ убедиться, что ваш код стреляет, когда HTML готов к удару. Это не обязательно для кода, который падает в нижней части тега тела, если только (возможно) вы сами что-то нанесете на себя.

3. Какая последовательность событий имеет место, когда документ создается, непосредственно перед запуском document.ready?

В тот момент, когда готов документ, все теги разобраны, а размеры макета установлены. Изображения не обязательно должны быть полностью загружены, и я только догадываюсь, но я подозреваю, что не-макет, влияющий на CSS, может показываться не в некоторых браузерах. Элемент считается "готовым", когда его закрывающий тег был прочитан и исполнен парсером HTML. JS в тегах script должен обрабатываться интерпретатором до того, как синтаксический анализ HTML может продолжаться, поэтому мы склонны поместить наш код в нижней части документа в настоящее время в любом случае для более быстрого восприятия времени загрузки.