Отсрочка JavaScript

#javascript #head #deferred #placement

#javascript #отложенный #заголовок

Вопрос:

Является ли размещение <script> тегов непосредственно перед закрытием <body> тега тем же sa, что и размещение их в <head> разделе и указание defer="defer" атрибута?

Ответ №1:

Да / Нет.

Да, потому что размещение тега defer ожидает загрузки документа перед выполнением.

Нет, потому что размещение <script> перед </body> тегом не обязательно означает, что документ полностью загружен, поскольку между закрывающим тегом body и закрывающим тегом HTML могут быть другие теги. Пример

 <html>
  <head>
  </head>
  <body>
  <script>...</script>
  </body>
  <link/>
  <script>
  although it is invalid HTML most browsers will render tags outside the body. This is 
  probably more of an error in code
  <div> some content</div>
</html>
  

Также следует отметить, что атрибут defer тега script работает не во всех браузерах.

Отредактировано:

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

http://developer .yahoo.com/performance/rules.html

Комментарии:

1. Я прошу с точки зрения скорости, не иметь возможности использовать DOM в JavaScript, для которого я бы использовал события. JavaScript, который помещается перед body, не нужен для структуры страницы или чего-то подобного и, таким образом, может быть загружен последним, после того, как страница доступна для просмотра. Я не понимаю, что вы имеете в виду в части «нет». «размещение перед тегом не обязательно означает, что документ полностью загружен, поскольку у вас могут быть другие вкладки между закрывающим тегом body и закрывающим тегом HTML» Зачем мне размещать теги между </body> и </html>?

2. @Francisc Я отредактировал свой ответ, поскольку у меня было несколько проблем с форматированием. Извините за это. Что касается вашего комментария по поводу скорости. Единственное, что я хотел бы упомянуть, это то, что браузер будет кэшировать JS-файлы по мере необходимости, и вы фактически не будете загружать js-файл в кэш. Использование defer не обязательно принесет вам пользу, потому что defer остановит выполнение только до тех пор, пока страница не будет полностью загружена. Он не откладывает вызов для получения самого файла сценария. Поэтому в вашем экземпляре вы захотите разместить теги скрипта после <body> тега для повышения производительности.

3. @JohnHartsock нет комментариев по поводу плохой кроссбраузерной поддержки?

4. @Raynos Я упоминал, что атрибут defer «не работает во всех браузерах»

5. @JohnHartsock я упоминал, что я слепой? Не знаю, как я это пропустил.

Ответ №2:

для отсрочки требуется Gecko 1.9.1 Этот логический атрибут установлен для указания браузеру, что скрипт предназначен для выполнения после анализа документа. Поскольку эта функция еще не реализована во всех других основных браузерах, авторам не следует предполагать, что выполнение скрипта действительно будет отложено. Никогда не вызывайте document.write() из сценария отсрочки (начиная с Gecko 1.9.2, это приведет к удалению документа). Атрибут defer не должен использоваться в сценариях, у которых нет атрибута src. Начиная с Gecko 1.9.2, атрибут defer игнорируется в сценариях, у которых нет атрибута src. Однако в Gecko 1.9.1 даже встроенные скрипты откладываются, если установлен атрибут defer.

Когда документ завершит синтаксический анализ, и в конце <body> тега они похожи, но не совсем одинаковы.

Также важно отметить, что это работает только для сценариев с внешним src набором.

Ответ №3:

В целом да, но браузеры не гарантируют, что они будут выполнять JavaScript после загрузки страницы, если вы не укажете это (defer=»отложить»).

Комментарии:

1. Я не понимаю, разве это не то, что я сказал: что они будут выполнять код с defer=»отложить» после загрузки DOM?

2. Ваш вопрос был: являются ли X и Y одинаковыми? Ну, на самом деле, в большинстве случаев это будет одно и то же. Я сказал, что это не гарантировано. То есть браузеры не сообщают вам: «Если вы поместите свой скрипт в конец, он будет выполнен после загрузки». Обычно они это делают, но если они запустят ваш скрипт перед рендерингом страницы, они не будут противоречить их документации, поскольку в этих последующих ничего об этом не говорится.