JavaScript: события загрузки DOM, последовательность выполнения и $(document).ready()

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

Предположим, что у меня есть такая структура:

<head>

<script src="jquery.js" type="text/javascript"></script>
<script src="first.js" type="text/javascript"></script>
</head>
<body>
...
<script type="text/javascript" id="middle">
    // some more JS here...
</script>
...
<script src="last.js" type="text/javascript"></script>
</body>

Вот мои вопросы:

  • В какой последовательности происходят события? Сначала выполняется DOM, затем выполняется JS, наоборот, или это одновременное (или как только файлы JS заканчивают загрузку, без учета DOM)? Я знаю, что скрипты загружаются по порядку.

  • Где находится $(document).ready()? В закладке Firebug Net отображается событие DOMContentLoaded и событие load. Вызывается $(document).ready(), когда срабатывает событие DOMContentLoaded? Не удалось найти какую-либо конкретную информацию об этом (все просто упоминают "при загрузке DOM" ).

  • Что именно означает "когда загружается DOM"? Что все HTML/JS было загружено и проанализировано браузером? Или просто HTML?

  • Возможна ли следующая сценария: есть $(document).ready(), который вызывает код в last.js, но работает до того, как загружен файл last.js? Где, скорее всего, будет (в first.js или встроенном блоке кода)? Как предотвратить этот сценарий?

Я хочу раскрыть общую картину того, что происходит, когда и что зависит от того, что (если вообще).

Ответ 1

Javascript выполняется, как видно. Обычно браузер перестает анализировать страницу, как только он видит тег <script>, загружает и запускает script, а затем продолжает работу. Вот почему обычно рекомендуется размещать теги <script> внизу: так что у пользователя нет пустой страницы, пока браузер ждет загрузки скриптов.

Однако, начиная с Firefox 3.5, сценарии загружаются в фоновом режиме, пока остальная часть страницы отображается. В необычном случае, когда script использует document.write или аналогичный, Firefox будет при необходимости обновляться и перерисовываться. Я не думаю, что другие браузеры делают это на данный момент, но я не удивлюсь, если это произойдет, и IE по крайней мере поддерживает атрибут defer в теге <script>, который откладывает загрузку script до тех пор, пока после загрузки страницы.

DOMContentLoaded - это именно то, что: он запускается, как только DOM загружается. То есть, как только браузер проанализировал весь HTML-код и создал его внутреннее дерево. Он НЕ дожидается загрузки изображений, CSS и т.д. DOM - это все, что вам обычно нужно, чтобы запускать любой Javascript, который вам нужен, поэтому приятно не ждать других ресурсов. Тем не менее, я считаю, что только Firefox поддерживает DOMContentLoaded; в других браузерах ready() просто привяжет событие к обычному старому onload.

Javascript гарантированно работает в том порядке, в котором он отображается в вашем HTML, поэтому просто убедитесь, что ваша функция определена до того, как вы попытаетесь прикрепить ее к событию.

Ответ 2

  • Все script включают в себя, чтобы они отображались в html, они загружаются, когда HTML обрабатывается.
  • Это означает, что все объекты dom были загружены, и все они включают скрипты и css. (Возможно, изображения еще не созданы).
  • см. 2.
  • $(document).ready() получает вызов только после загрузки всех скриптов и dom-объектов, все должно быть хорошо.

Ответ 3

http://javascript.about.com/od/hintsandtips/a/exeorder.htm должен помочь вам ответить, что

в основном: сначала загружаются все данные (html), затем js вначале выполняется код внутри головы/тела, который не находится в функции или не готов или что-то в этом роде. оттуда последовательно идет скрипт

важно отметить, что js имеет преимущество перед ie. загрузка css - так что вы должны иметь представление о производительности, вы должны иметь js в нижней части страницы.

так @4: вам не нужно предотвращать этот сценарий, потому что first.js всегда читается/выполняется до last.js