Я могу запустить JavaScript, прежде чем целая страница будет загружена?

Я хочу запустить немного JavaScript, прежде чем целая страница загрузилась. Действительно ли это возможно? Или делает код, начинают выполняться на </html>?

84
задан picknick 27 May 2010 в 10:05
поделиться

2 ответа

Не только может вас, но вам нужно приложить особые усилия , а не , если вы не хотите.: -)

Когда браузер встречает тег 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 о том, чтобы вы просто помещали свои скрипты прямо перед закрывающим тегом (поскольку вы должны поместить их где-нибудь , после все, а там внизу они не задерживают отображение вашей страницы).Лично я вижу некоторую ценность в этих мероприятиях, хотя я думаю, что они слишком часто используются, но я считаю, что вы можете начать взаимодействовать с вещами очень рано.

166
ответ дан 24 November 2019 в 08:33
поделиться

Вы можете запустить код JavaScript в любое время. AFAIK он выполняется в тот момент, когда браузер достигает тега