При встраивании JavaScript в HTML-документ, где находится правильное место для размещения <script>
тегов и включенного JavaScript? Кажется, я вспоминаю, что вы не должны размещать их в <head>
разделе, но размещение в начале <body>
раздела тоже плохо, так как JavaScript должен быть проанализирован до того, как страница будет полностью отображена (или что-то в этом роде). Это , кажется , оставить конец этого <body>
раздела в качестве логического места для <script>
тегов.
Так, где это правильное место , чтобы поставить <script>
метки?
(Этот вопрос ссылается на этот вопрос , в котором предлагалось перенести вызовы функций JavaScript из <a>
тегов в <script>
теги. Я специально использую jQuery, но более общие ответы также подходят.)
javascript
jquery
html
mipadi
источник
источник
Ответы:
Вот что происходит, когда браузер загружает сайт с
<script>
тегом на нем:<script>
тег, ссылающийся на внешний файл сценария.Шаг № 4 вызывает плохой пользовательский опыт. Ваш сайт в основном перестает загружаться, пока вы не загрузите все скрипты. Если есть одна вещь, которую пользователи ненавидят, это ждет загрузки сайта.
Почему это вообще происходит?
Любой скрипт может вставить свой собственный HTML с помощью
document.write()
или других манипуляций с DOM. Это подразумевает, что синтаксический анализатор должен ждать, пока скрипт не будет загружен и выполнен, прежде чем он сможет безопасно проанализировать остальную часть документа. В конце концов, скрипт мог вставить свой собственный HTML в документ.Однако большинство разработчиков JavaScript больше не манипулируют DOM во время загрузки документа. Вместо этого они ждут, пока документ не будет загружен, прежде чем изменять его. Например:
Javascript:
Поскольку ваш браузер не знает, что my-script.js не будет изменять документ, пока он не будет загружен и выполнен, синтаксический анализатор прекращает синтаксический анализ.
Устаревшая рекомендация
Старый подход к решению этой проблемы заключался в размещении
<script>
тегов внизу вашего<body>
, потому что это гарантирует, что парсер не будет заблокирован до самого конца.У этого подхода есть своя собственная проблема: браузер не может начать загрузку сценариев, пока весь документ не будет проанализирован. Для больших веб-сайтов с большими сценариями и таблицами стилей возможность загрузки сценария как можно скорее очень важна для производительности. Если ваш сайт не загружается в течение 2 секунд, люди перейдут на другой сайт.
В оптимальном решении браузер начнет загрузку ваших сценариев как можно скорее, в то же время анализируя остальную часть вашего документа.
Современный подход
Сегодня браузеры поддерживают
async
иdefer
атрибуты на скриптах. Эти атрибуты сообщают браузеру, что безопасно продолжать анализ во время загрузки скриптов.асинхронной
Сценарии с атрибутом async выполняются асинхронно. Это означает, что скрипт выполняется сразу после его загрузки, не блокируя браузер.
Это означает, что сценарий 2 может быть загружен и выполнен до сценария 1.
Согласно http://caniuse.com/#feat=script-async , 97,78% всех браузеров поддерживают это.
Перенести
Сценарии с атрибутом defer выполняются по порядку (т. Е. Сначала сценарий 1, затем сценарий 2). Это также не блокирует браузер.
В отличие от асинхронных сценариев, отложенные сценарии выполняются только после полной загрузки документа.
Согласно http://caniuse.com/#feat=script-defer , 97,79% всех браузеров поддерживают это. 98,06% поддерживают это хотя бы частично.
Важное замечание о совместимости браузера: в некоторых случаях IE <= 9 может выполнять отложенные сценарии не по порядку. Если вам нужно поддерживать эти браузеры, пожалуйста, прочитайте это в первую очередь!
Вывод
Текущий уровень техники заключается в том, чтобы помещать сценарии в
<head>
тег и использовать атрибутыasync
ordefer
. Это позволяет загружать ваши скрипты как можно быстрее, не блокируя ваш браузер.Хорошо, что ваш сайт все равно должен корректно загружаться в 2% браузеров, которые не поддерживают эти атрибуты, в то время как другие 98% ускоряются.
источник
document.write
действует на дом. Вопрос не в том, управляет ли сценарий dom, а в том, когда он это делает. Пока все манипуляции с dom происходят после того, какdomready
событие сработало, вы в порядке. jQuery - это библиотека, которая сама по себе не управляет и не должна манипулировать dom.async
иdefer
атрибуты не используются нигде? Я имею в виду, что я просмотрел много HTML-источников из Интернета, и нигде не вижу атрибутовasync
иdefer
. ...?Как раз перед закрывающим тегом тела, как указано на
http://developer.yahoo.com/performance/rules.html#js_bottom
источник
Неблокирующие теги скрипта могут быть размещены где угодно:
async
скрипт будет выполняться асинхронно, как только он станет доступенdefer
скрипт выполняется по окончании разбора документаasync defer
скрипт возвращается к отложенному поведению, если асинхронность не поддерживаетсяТакие сценарии будут выполняться асинхронно / после того, как документ будет готов, что означает, что вы не можете сделать это:
Или это:
Или это:
Или это:
Сказав это, асинхронные сценарии предлагают следующие преимущества:
Браузер может загружать таблицы стилей, изображения и другие сценарии параллельно, не дожидаясь загрузки и выполнения сценария.
Вы можете размещать скрипты внутри головы или тела, не беспокоясь о блокировке (полезно, если вы используете CMS). Порядок исполнения все еще имеет значение, хотя.
Можно обойти проблемы порядка выполнения с помощью внешних сценариев, поддерживающих обратные вызовы. Многие сторонние API JavaScript поддерживают неблокирующее выполнение. Вот пример загрузки API Карт Google в асинхронном режиме .
источник
<head>
логику включения.async
илиdefer
при включении JQuery , как вы укажете в вашем втором блоке:<script src="jquery.js" async></script>
. Вы можете объяснить, почему? Я подумал, что мне нужно иметь асинхронный тег для повышения производительности (согласно принятому ответу), чтобы моя страница могла загружаться даже во время загрузки jQuery]. Спасибо!<script src=jquery.js>
сопровождается$(function(){ ... })
блоками где-то на странице. Асинхронная загрузка не гарантирует, что jQuery будет загружен в то время, когда браузер попытается проанализировать эти блоки, следовательно, это вызовет ошибку $ notfined error (вы можете не получить ошибку, если jQuery был загружен из кэша). Я ответил на вопрос о загрузке jQuery асинхронно и сохранить$(function(){ ... })
. Я посмотрю, смогу ли я найти его, или вы можете посмотреть на этот вопрос: stackoverflow.com/q/14811471/87015jquery
загрузить lib, затем мои оставшиеся.js
скрипты. Когда я объявляюasync
илиdefer
наjquery
теге сценария lib, мои.js
сценарии не работают. Я думал,$(function(){ ... })
что защищал это - не думаю. Текущее решение: я не добавляюdefer
илиasync
наjquery
Lib сценарий, но я добавитьasync
в моем РАЗВЕЙТЕ.js
сценарии. Примечание: причина я делаю какой - либо из этого, чтобы сделать Google Page Speed счастливым. Спасибо еще раз за помощь! Любой другой совет приветствуется. (Или ссылка на ваш предыдущий ответ). :)Стандартный совет, продвигаемый Yahoo! Команда «Исключительная производительность» должна размещать
<script>
теги в конце тела документа, чтобы они не блокировали отображение страницы.Но есть несколько более новых подходов, которые предлагают лучшую производительность, как описано в этом ответе о времени загрузки файла Google Analytics JavaScript:
источник
Если вы используете JQuery, поместите javascript в
$(document).ready()
любое удобное для вас место и используйте его, чтобы убедиться, что все загружено правильно перед выполнением каких-либо функций.На заметку: мне нравятся все мои теги сценариев в
<head>
разделе, так как это кажется самым чистым местом.источник
<header>
?$(document).ready()
не означает, что вы можете поместить свой JavaScript куда угодно - вам все равно придется поместить его после того места,<script src=".../jquery.min.js">
куда вы включили jQuery, чтобы он$
существовал.header
элемент является частью содержимого документа HTML и должен встречаться один или несколько раз в теге headbody
элемента. The
для метаданных и данных, не относящихся к содержимому документа. Это, в эти дни, сdefer
иasync
идеальным местом для тегов сценария.header
элементы должны содержать только информацию, которая описывает раздел документа, который следует за ним.Современный подход в 2019 году - использование скриптов типа модуля ES6 .
По умолчанию модули загружаются асинхронно и игнорируются. то есть вы можете разместить их где угодно, и они будут загружаться параллельно и выполняться после завершения загрузки страницы.
Различия между скриптом и модулем описаны здесь:
https://stackoverflow.com/a/53821485/731548
Выполнение модуля по сравнению со сценарием описано здесь:
https://developers.google.com/web/fundamentals/primers/modules#defer
Поддержка показана здесь:
https://caniuse.com/#feat=es6-module
источник
XHTML не будет проверяться, если скрипт находится не в элементе head, а в другом месте.Оказывается, это может быть везде.Вы можете отложить выполнение с помощью чего-то вроде jQuery, чтобы не имело значения, где оно находится (за исключением небольшого снижения производительности во время синтаксического анализа).
источник
Тег script должен всегда использоваться перед закрытием тела или Bottom в HTML- файле.
затем вы можете увидеть содержимое страницы перед загрузкой файла js .
проверьте это, если требуется: http://stevesouders.com/hpws/rule-js-bottom.php
источник
Обычный (и общепринятый) ответ - «внизу», потому что тогда весь DOM будет загружен, прежде чем что-либо сможет начать выполняться.
Существуют несогласные по разным причинам, начиная с имеющейся практики намеренного начала исполнения с события загрузки страницы.
источник
Лучшее место , чтобы поместить
<script>
тег перед закрытием</body>
тега , поэтому загрузки и выполнения не блокирует браузер для разбора HTML в документе,Кроме загрузки JS файлов внешне имеют собственные преимущества , как это будет в кэше браузеров и может ускорить время загрузки страницы , он отделяет HTML и код JavaScript и помощь для управления базой коды лучше .
но современные браузеры также поддерживают некоторые другие оптимальные способы, такие как
async
иdefer
загрузка внешнихjavascript
файлов.Асинхронный и отложенный
Обычно выполнение HTML-страницы начинается построчно. При обнаружении внешнего элемента JavaScript синтаксический анализ HTML останавливается до тех пор, пока JavaScript не будет загружен и готов к выполнению. Это нормальное выполнение страницы можно изменить с помощью
defer
иasync
атрибута.Defer
Когда используется атрибут defer, JavaScript загружается параллельно с разбором HTML, но будет выполняться только после полного разбора HTML.
Async
Когда используется асинхронный атрибут, JavaScript загружается, как только сценарий встречается, и после загрузки он будет выполняться асинхронно (параллельно) вместе с анализом HTML.
Когда использовать какие атрибуты
async
.async
, оба будут работатьпараллельно с разбором HTML, как только они будут загружены
и доступны.
defer
оба:defer
, тогда script1 гарантированно выполняется первым,async
скрипта, используйте ваш скрипт без атрибутов и поместите его над всемиasync
скриптами.ссылка: знаниеhills.com
источник
Зависит от того, что если вы загружаете скрипт, необходимый для стилизации вашей страницы / используя действия на вашей странице (например, нажатие кнопки), то вам лучше разместить его сверху. Если ваш стиль на 100% CSS и у вас есть все запасные варианты для действий кнопок, вы можете поместить его внизу.
Или, что лучше (если это не проблема), вы можете создать модальное окно загрузки, поместить свой javascript внизу страницы и заставить его исчезнуть, когда будет загружена последняя строка вашего скрипта. Таким образом, вы можете избежать использования пользователями действий на вашей странице перед загрузкой скриптов. А также избегайте неправильной укладки.
источник
Включение скриптов в конце используется в основном там, где контент / стили сайта должны быть показаны первыми.
включение сценариев в заголовок загружает сценарии заранее и может использоваться до загрузки всего веб-сайта.
если сценарии введены в конце концов, проверка произойдет только после загрузки всех стилей и дизайна, что не приветствуется для быстро реагирующих веб-сайтов.
источник
В зависимости от сценария и его использования наилучшим возможным (с точки зрения загрузки страницы и времени рендеринга) может быть не использование обычного тега <script> как такового, а динамический запуск загрузки сценария асинхронно.
Есть несколько различных методов, но наиболее прямым является использование document.createElement ("script"), когда инициируется событие window.onload. Затем сценарий загружается первым после отображения самой страницы, что не влияет на время, в течение которого пользователь должен ждать появления страницы.
Это, естественно, требует, чтобы сам скрипт не использовался для рендеринга страницы.
Для получения дополнительной информации см. Пост Асинхронные сценарии сопряжения Стивом Соудерсом (создатель YSlow, но теперь в Google).
источник
Если вы все еще заботитесь о поддержке и производительности в IE <10, лучше ВСЕГДА сделать так, чтобы ваш скрипт помечал последние теги вашего тела HTML. Таким образом, вы уверены, что остальная часть DOM была загружена, и вы не будете блокировать и рендеринг.
Если вас больше не волнует IE <10, возможно, вы захотите поместить свои скрипты в заголовок документа и использовать их,
defer
чтобы убедиться, что они запускаются только после загрузки DOM (<script type="text/javascript" src="path/to/script1.js" defer></script>
). Если вы все еще хотите, чтобы ваш код работал в IE <10, не забудьте обернуть ваш код вwindow.onload
четное, хотя!источник
Скрипт блокирует загрузку DOM, пока он не загружен и не выполнен.
Если вы помещаете скрипты в конец, то
<body>
все DOM имеет шанс загрузить и отобразить (страница будет «отображаться» быстрее).<script>
будет иметь доступ ко всем этим элементам DOM.С другой стороны, размещение его после
<body>
запуска или выше выполнит скрипт (там, где до сих пор нет элементов DOM).Вы включаете jQuery, что означает, что вы можете разместить его где угодно и использовать .ready ()
источник
Я думаю, что это зависит от исполнения веб-страницы. Если страница, которую вы хотите отобразить, не может отображаться должным образом без предварительной загрузки JavaScript, то сначала следует включить файл JavaScript. Но если вы можете отображать / отображать веб-страницу без первоначальной загрузки файла JavaScript, то вам следует поместить код JavaScript внизу страницы. Поскольку он будет эмулировать быструю загрузку страницы, и с точки зрения пользователя кажется, что эта страница загружается быстрее.
источник
Вы можете разместить большинство
<script>
ссылок в конце<body>
,но если на вашей странице есть активные компоненты, использующие внешние скрипты,
то перед ними должна стоять их зависимость (js-файлы) (в идеале - в теге head).
источник
До конца тега body для предотвращения и блокировки пользовательского интерфейса.
источник
В конце HTML-документа
Так что это не повлияет на загрузку HTML-документа в браузере во время выполнения.
источник
Лучшее место для написания
JavaScript
кода - в конце документа после или непосредственно перед</body>
тегом, чтобы сначала загрузить документ, а затем выполнить код js.А если вы напишете
JQuery
следующее, может быть в заголовке документа и он будет выполняться после загрузки документа:источник
SyntaxError
Для меня имеет больше смысла включать скрипт после HTML. Потому что большую часть времени мне нужно загрузить Dom, прежде чем я выполню свой скрипт. Я мог бы поместить его в тег head, но мне не нравятся все издержки прослушивателя загрузки документов. Я хочу, чтобы мой код был коротким, приятным и легким для чтения.
Я слышал, что старые версии safari были странными при добавлении вашего скрипта вне тега head, но я говорю, кого это волнует. Я не знаю, чтобы кто-нибудь использовал эту старую чушь.
Хороший вопрос, кстати.
источник
Вы можете разместить там, где вы хотите сценарии, и один не лучше, чем другая практика.
Ситуация выглядит следующим образом:
Страница загружается линейно, «сверху вниз», поэтому, если вы поместите скрипт в заголовок, убедитесь, что он начинает загружаться раньше всего, теперь, если вы поместите его внутрь тела, смешанного с кодом, это может вызвать неприглядную загрузку страницы.
определить хорошую практику не зависит от того, где.
Чтобы поддержать вас, я упомяну следующее:
Вы можете разместить:
и страница будет загружаться линейно
страница загружается асинхронно с другим контентом
содержимое страницы будет загружено до и после завершения загрузки скрипты загружаются
Хорошей практикой здесь будет, когда будет реализовывать каждый?
Я надеюсь, что я был полезным, что-нибудь просто ответьте мне на этот вопрос.
источник