Убедитесь, что скрипт Javascript запускается первым? - PullRequest
8 голосов
/ 22 февраля 2012

Я заметил, что некоторые скрипты, по-видимому, вызываются раньше других на определенной странице, мне было интересно, каков конкретный порядок загрузки скриптов?На странице перед ссылками скриптов .js?Они запускаются в порядке от первого <script>, указанного до последнего на странице, или это зависит от браузера?Как можно убедиться, что на странице запускается определенный скрипт?

Ответы [ 4 ]

9 голосов
/ 22 февраля 2012

Пока сценарии не загружаются динамически или не помечены как асинхронные или отложенные, сценарии запускаются или оцениваются в порядке, встречающемся на странице. Итак, первые найденные сценарии запускаются первыми.

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

Таким образом, порядок оценки нормального (не асинхронного, не отложенного) javascript определен на 100%, так как он встречается на странице.

5 голосов
/ 22 февраля 2012

По умолчанию теги script загружаются и оцениваются последовательно, поскольку они встречаются в документе HTML.

Однако, если вы используете атрибуты async или defer, выполнение происходит либо после завершения загрузки скрипта (асинхронного), либо после загрузки страницы (откладывание).

4 голосов
/ 23 февраля 2012

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

Это установлено W3C в их языковых спецификациях.Например, для спецификации HTML 4.01 она определена в Раздел 18.2.4 Динамическое изменение документов, элемент 1 .

На странице перед ссылкамиСкрипты .js?

См. выше.Нет, встроенные и связанные скрипты обрабатываются одинаково.

Работают ли они в порядке от первого до последнего на странице, или это зависит от браузера?

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

Еще одна вещь, которую следует учитывать, это определение «беги».Это может звучать как семантический разбор, но это не так.JavaScript, как и любой язык программирования, сам по себе спроектирован так, чтобы вести себя в соответствии со стандартами.JavaScript указан в стандарте ECMA-262 5.1 / июнь 2011 года для оценки слева направо в разделе 7 Лексических соглашений.(Окончания строк обрабатываются как крайний левый символ следующей строки.) В этом документе также содержатся условные обозначения для порядка, в котором оцениваются операторы и другие операции, такие как операторы WHILE или FOR.

Как можно убедиться, что на странице сначала запускается определенный скрипт?

(1) Поставьте его сверху и (2) выберите браузер, который реализует спецификацию языка.

Однако я чувствую, что за этим вопросом может быть что-то большее.Если вы пытаетесь остановить выполнение неожиданного кода, вам придется заблокировать его, пока обработчик события ONLOAD не зарегистрирует, что страница заполнена.(Просто заключите ваши операции в функцию или окружите их IF, чтобы проверить на наличие логического флага, т.е. isLoaded устанавливается в true с помощью ONLOAD.) Затем, когда обработчик события ONLOAD сработает, вы можете запускать операции по своему собственному расписанию безприходится беспокоиться о таких вещах, как необоснованные объекты DOM.

1 голос
/ 22 февраля 2012

Сценарии выполняются в том порядке, в котором они оцениваются в html-файле, так же, как вы читаете их сверху вниз.

Однако async и defer могут переопределить это для браузеров, в которых они реализованы.

...