Я хочу запустить немного JavaScript, прежде чем целая страница загрузилась. Действительно ли это возможно? Или делает код, начинают выполняться на </html>
?
Не только может вас, но вам нужно приложить особые усилия , а не , если вы не хотите.: -)
Когда браузер встречает тег script
при синтаксическом анализе HTML, он прекращает синтаксический анализ и передает его интерпретатору Javascript, который запускает сценарий. Анализатор не продолжает работу до завершения выполнения сценария (поскольку сценарий может выполнять вызовы document.write
для вывода разметки, которую должен обрабатывать синтаксический анализатор). Это поведение по умолчанию; есть атрибуты тега скрипта
, которые изменяют это поведение ( defer
и async
) (и поскольку они меняют его, скрипты, загруженные с defer
или async
не может использовать document.write
для вывода HTML на загружаемую страницу).
Примите во внимание следующее:
Строка 1
Строка 2
Если вы загрузите эту страницу, в предупреждении будет отображаться «Абзацы: 1», потому что в этой точке в DOM существует только один элемент p
( тот, который содержит «Строку 1»). Вы можете видеть или не видеть Строку 1 на дисплее браузера, в зависимости от браузера, потому что даже если элемент находится в DOM, браузер, возможно, еще не успел отобразить его (с alert
останавливает поток пользовательского интерфейса).
Некоторые браузеры ... корректируют ... однако поведение предупреждения
.Например, если у вас есть этот код на странице и вы открыли его на новой вкладке в фоновом режиме, последние версии Chrome позволили бы странице продолжить загрузку (и разрешить выполнение кода JavaScript) и отображать предупреждение, когда вы переходите на вкладку, хотя это сильно отличается от поведения, когда вы сталкиваетесь с этим предупреждением, когда вкладка активна.
Независимо от того, были они отрисованы или нет, вы можете легко получить доступ к более ранним элементам, поэтому мы видели «Абзацы: 1» выше. Вот еще один пример:
Строка 1
Строка 2
В результате вы увидите:
Line 1 p1 is null? no p2 is null? yes Line 2
... потому что p1
существует на момент запуска сценария, но p2
нет.
У меня нет под рукой ссылки, но В этом сообщении разработчики библиотеки Google Closure говорят, что не видят большой ценности в событиях «готового» стиля, которые Prototype, jQuery, ExtJS, Dojo и большинство других предоставляют, потому что, если вы поместите сценарий после элементов, с которыми хотите взаимодействовать, все в порядке; что соответствует рекомендации YUI о том, чтобы вы просто помещали свои скрипты прямо перед закрывающим тегом