<script>: Элемент скрипта
Элемент <script> HTML используется для встраивания исполняемого кода или данных; обычно это используется для встраивания или ссылки на код JavaScript. Элемент <script> также может использоваться с другими языками, такими как язык программирования шейдеров GLSL WebGL и язык JSON.
Атрибуты
Этот элемент включает глобальные атрибуты.
async-
Для классических скриптов, если атрибут
asyncприсутствует, то классический скрипт будет загружен параллельно с разбором и оценен как только он будет доступен.Для скриптов модулей, если присутствует атрибут
async, то скрипты и все их зависимости будут загружены параллельно с разбором и оценены как только они будут доступны.Предупреждение: Этот атрибут не должен использоваться, если атрибут
srcотсутствует (т. е. для встроенных скриптов) для классических скриптов, в этом случае он не будет иметь никакого эффекта.Этот атрибут позволяет устранить блокирование парсера JavaScript, где браузеру необходимо загрузить и оценить скрипты, прежде чем продолжить разбор.
deferимеет аналогичный эффект в этом случае.Если атрибут указан с атрибутом
defer, элемент будет действовать так, как будто указан только атрибутasync.Это булевый атрибут: наличие булевого атрибута на элементе представляет истинное значение, а отсутствие атрибута представляет ложное значение.
См. Совместимость с браузерами для получения сведений о поддержке браузерами. См. также Асинхронные скрипты для asm.js.
-
attributionsrcЭкспериментальный -
Указывает, что вы хотите, чтобы браузер отправил заголовок
Attribution-Reporting-Eligibleвместе с запросом на ресурс скрипта. На стороне сервера это используется для запуска отправки заголовкаAttribution-Reporting-Register-SourceилиAttribution-Reporting-Register-Triggerв ответе для регистрации JavaScript-источника атрибуции или JavaScript-триггера атрибуции соответственно. Какой заголовок ответа должен быть отправлен, зависит от значения заголовкаAttribution-Reporting-Eligible, который инициировал регистрацию.Примечание: В качестве альтернативы JavaScript-источники или триггеры атрибуции могут быть зарегистрированы путем отправки запроса
fetch(), содержащего опциюattributionReporting(установленная непосредственно в вызовеfetch()или в объектеRequest, переданном в вызовfetch()), или путем отправкиXMLHttpRequestс вызовомsetAttributionReporting()на объекте запроса.Существует две версии этого атрибута, которые вы можете задать:
- Булево, т. е. только имя
attributionsrc. Это указывает, что вы хотите, чтобы заголовокAttribution-Reporting-Eligibleбыл отправлен на тот же сервер, что и атрибутsrc. Это подходит, когда вы обрабатываете регистрацию источника или триггера атрибуции на том же сервере. При регистрации триггера атрибуции это свойство необязательно, и будет использоваться пустое строковое значение, если оно опущено. - Значение, содержащее один или несколько URL-адресов, например: Это полезно в случаях, когда запрашиваемый ресурс не находится на сервере, которым вы управляете, или вы просто хотите обработать регистрацию источника атрибуции на другом сервере. В этом случае вы можете указать один или несколько URL-адресов в качестве значенияhtml
<script src="myscript.js" attributionsrc="https://a.example/register-source https://b.example/register-source"></script>
attributionsrc. При выполнении запроса к ресурсу заголовокAttribution-Reporting-Eligibleбудет отправлен на указанные вattributionSrcURL-адреса в дополнение к источнику ресурса. Затем эти URL-адреса могут ответить с заголовкомAttribution-Reporting-Register-SourceилиAttribution-Reporting-Register-Triggerдля завершения регистрации.Примечание: Указание нескольких URL-адресов означает, что на одной функции могут быть зарегистрированы несколько источников атрибуции. Например, у вас могут быть разные кампании, успех которых вы пытаетесь измерить, что включает в себя создание разных отчетов на разных данных.
Дополнительные сведения см. в API отчетов об атрибуции.
- Булево, т. е. только имя
-
blockingЭкспериментальный -
Этот атрибут явно указывает, что определенные операции должны быть заблокированы при загрузке скрипта. Операции, которые должны быть заблокированы, должны быть перечислены в виде списка заблокированных маркеров, разделенных пробелами, перечисленных ниже.
-
render: Блокируется отображение содержимого на экране.
-
crossorigin-
Обычные элементы
scriptпередают минимальную информацию в событиеwindow.onerrorдля скриптов, которые не проходят стандартные проверки CORS. Чтобы разрешить ведение журнала ошибок для сайтов, использующих отдельный домен для статических медиа, используйте этот атрибут. См. Атрибуты параметров CORS для более подробного объяснения допустимых аргументов. defer-
Этот булевый атрибут устанавливается для указания браузеру, что скрипт должен быть выполнен после разбора документа, но перед запуском события
DOMContentLoaded.Скрипты с атрибутом
deferбудут предотвращать срабатывание событияDOMContentLoaded, пока скрипт не загрузится и не завершит оценку.Предупреждение: Этот атрибут не должен использоваться, если атрибут
srcотсутствует (т. е. для встроенных скриптов), в этом случае он не будет иметь никакого эффекта.Атрибут
deferне влияет на скрипты модулей — они откладываются по умолчанию.Скрипты с атрибутом
deferбудут выполняться в том порядке, в котором они появляются в документе.Этот атрибут позволяет устранить блокирование парсера JavaScript, где браузеру необходимо загрузить и оценить скрипты, прежде чем продолжить разбор.
asyncимеет аналогичный эффект в этом случае.Если атрибут указан с атрибутом
async, элемент будет действовать так, как будто указан только атрибутasync. fetchpriority-
Предоставляет подсказку о приоритете при загрузке внешнего скрипта. Допустимые значения:
integrity-
Этот атрибут содержит служебные данные, которые пользовательский агент может использовать для проверки того, что полученный ресурс был передан без непредвиденных изменений. Атрибут не должен быть указан, если атрибут
srcне указан. См. Подтверждение целостности подресурсов. nomodule-
Этот булевый атрибут устанавливается для указания того, что скрипт не должен выполняться в браузерах, которые поддерживают ES-модули — по сути, это может быть использовано для предоставления резервных скриптов для более старых браузеров, которые не поддерживают модульный код JavaScript.
nonce-
Криптографический одноразовый идентификатор (nonce) для разрешения скриптов в политике Content-Security-Policy (script-src). Сервер должен генерировать уникальное значение nonce каждый раз, когда он передает политику. Очень важно предоставить nonce, который нельзя угадать, так как в противном случае обойти политику ресурса будет тривиально.
referrerpolicy
-
Указывает, какой ссылочный адрес отправить при загрузке скрипта или ресурсов, загружаемых скриптом:
-
no-referrer: ЗаголовокRefererне будет отправлен. -
no-referrer-when-downgrade: ЗаголовокRefererне будет отправлен для источников без TLS (HTTPS). -
origin: Отправляемый ссылочный адрес будет ограничен источником страницы-отправителя: её схемой, хостом и портом. -
origin-when-cross-origin: Ссылочный адрес, отправленный другим источникам, будет ограничен схемой, хостом и портом. Переходы в рамках одного источника всё ещё будут содержать путь. -
same-origin: Ссылочный адрес будет отправлен для тех же источников, но запросы к другим источникам не будут содержать информацию о ссылочном адресе. -
strict-origin: Отправлять только источник документа в качестве ссылочного адреса, когда уровень безопасности протокола остаётся неизменным (HTTPS→HTTPS), но не отправлять его менее защищённому ресурсу (HTTPS→HTTP). -
strict-origin-when-cross-origin(по умолчанию): Отправлять полный URL при запросе к одному источнику, отправлять только источник, когда уровень безопасности протокола остаётся неизменным (HTTPS→HTTPS), и не отправлять заголовок менее защищённому ресурсу (HTTPS→HTTP). -
unsafe-url: Ссылочный адрес будет включать источник и путь (но не фрагмент, пароль или имя пользователя). Это значение небезопасно, так как оно раскрывает источники и пути из защищённых TLS ресурсов для небезопасных источников.
Примечание: Пустое строковое значение (
"") является как значением по умолчанию, так и значением по умолчанию, еслиreferrerpolicyне поддерживается. Еслиreferrerpolicyне указан явно в элементе<script>, он будет принимать политику ссылочного адреса более высокого уровня, т. е. политику, установленную для всего документа или домена. Если политика более высокого уровня недоступна, пустая строка рассматривается как эквивалентstrict-origin-when-cross-origin. -
src-
Этот атрибут указывает URI внешнего скрипта; его можно использовать как альтернативу встраиванию скрипта непосредственно в документ.
type-
Этот атрибут указывает тип представленного скрипта. Значение этого атрибута будет одним из следующих:
- Атрибут не установлен (по умолчанию), пустая строка или тип MIME JavaScript
-
Указывает, что скрипт является "классическим скриптом", содержащим код JavaScript. Авторам рекомендуется опустить атрибут, если скрипт ссылается на код JavaScript, а не указывать тип MIME. Типы MIME JavaScript перечислены в спецификации типов MIME IANA.
importmap-
Это значение указывает, что тело элемента содержит карту импорта. Карта импорта — это объект JSON, который разработчики могут использовать для управления тем, как браузер разрешает спецификаторы модулей при импорте модулей JavaScript.
module-
Это значение заставляет код обрабатываться как модуль JavaScript. Обработка содержимого скрипта откладывается. Атрибуты
charsetиdeferне имеют эффекта. Сведения об использованииmodule, см. в нашем руководстве по модулям JavaScript. В отличие от классических скриптов, модульные скрипты требуют использования протокола CORS для загрузки из других источников. -
speculationrulesЭкспериментальный -
Это значение указывает, что тело элемента содержит правила спекуляции. Правила спекуляции имеют вид объекта JSON, который определяет, какие ресурсы браузер должен предварительно загрузить или предварительно отобразить. Это часть API правил спекуляции.
- Любое другое значение
-
Встроенное содержимое обрабатывается как блок данных и не будет обрабатываться браузером. Разработчики должны использовать допустимый тип MIME, который не является типом MIME JavaScript, для обозначения блоков данных. Все остальные атрибуты будут проигнорированы, включая атрибут
src.
Устаревшие атрибуты
-
charsetУстаревший -
Если присутствует, его значение должно быть ASCII регистронезависимым соответствием для "
utf-8". Необязательно указывать атрибутcharset, так как документы должны использовать UTF-8, и элементscriptнаследует кодировку символов из документа. -
languageУстаревший Нестандартный -
Как и атрибут
type, этот атрибут идентифицирует используемый язык сценариев. Однако в отличие от атрибутаtype, возможные значения этого атрибута никогда не были стандартизированы. Вместо этого следует использовать атрибутtype.
Примечания
Скрипты без атрибутов async, defer или type="module", а также встроенные скрипты без атрибута type="module", загружаются и выполняются немедленно перед тем, как браузер продолжит обработку страницы.
Скрипт должен быть предоставлен с типом MIME text/javascript, но браузеры лояльны и блокируют их только в том случае, если скрипт предоставлен с типом изображения (image/*), типом видео (video/*), типом аудио (audio/*) или text/csv. Если скрипт заблокирован, событие error отправляется элементу; в противном случае отправляется событие load.
Примеры
Базовое использование
Эти примеры показывают, как импортировать (внешний) скрипт с помощью элемента <script>.
<script src="javascript.js"></script>
А следующие примеры показывают, как вставить (встроенный) скрипт внутрь элемента <script>.
<script> alert("Hello World!"); </script>
async и defer
Скрипты, загруженные с помощью атрибута async, будут загружены без блокировки страницы во время загрузки скрипта. Однако после завершения загрузки скрипт будет выполнен, что заблокирует отображение страницы. Это означает, что остальной контент веб-страницы не будет обработан и отображен пользователю до завершения выполнения скрипта. Нет гарантии, что скрипты будут выполняться в определенном порядке. Лучше использовать async, когда скрипты на странице работают независимо друг от друга и не зависят от других скриптов на странице.
Скрипты, загруженные с помощью атрибута defer, будут загружаться в том порядке, в котором они появляются на странице. Они не будут выполняться до тех пор, пока не загрузится весь контент страницы, что полезно, если ваши скрипты зависят от наличия DOM (например, они изменяют один или несколько элементов на странице).
Вот визуальное представление различных методов загрузки скриптов и их влияния на вашу страницу:
Это изображение взято из спецификации HTML, скопировано и обрезано до сокращенной версии, под лицензией CC BY 4.0.
Например, если у вас есть следующие элементы скрипта:
<script async src="js/vendor/jquery.js"></script> <script async src="js/script2.js"></script> <script async src="js/script3.js"></script>
Вы не можете полагаться на порядок загрузки скриптов. jquery.js может загрузиться до или после script2.js и script3.js, и в этом случае любые функции в этих скриптах, зависящие от jquery, приведут к ошибке, потому что jquery не будет определено во время выполнения скрипта.
async следует использовать, когда у вас есть множество фоновых скриптов для загрузки, и вы просто хотите получить их как можно скорее. Например, возможно, у вас есть некоторые файлы данных игры, которые понадобятся, когда игра фактически начнётся, но пока вы просто хотите продолжить показ вступительного экрана, заголовков и лобби, не дожидаясь загрузки скриптов.
Скрипты, загруженные с помощью атрибута defer (см. ниже), будут выполняться в порядке их появления на странице и выполняться сразу после загрузки скрипта и содержимого:
<script defer src="js/vendor/jquery.js"></script> <script defer src="js/script2.js"></script> <script defer src="js/script3.js"></script>
Во втором примере мы можем быть уверены, что jquery.js загрузится до script2.js и script3.js, а script2.js загрузится до script3.js. Они не будут выполняться до тех пор, пока не загрузится весь контент страницы, что полезно, если ваши скрипты зависят от наличия DOM (например, они изменяют один или несколько элементов на странице).
В заключение:
-
asyncиdeferуказывают браузеру загрузить скрипт(ы) в отдельном потоке, пока загружается остальная часть страницы (DOM и т.д.), поэтому загрузка страницы не блокируется во время процесса загрузки. - скрипты с атрибутом
asyncбудут выполняться сразу после завершения загрузки. Это блокирует страницу и не гарантирует никакого определенного порядка выполнения. - скрипты с атрибутом
deferбудут загружаться в том порядке, в котором они находятся, и будут выполняться только после завершения загрузки всего. - Если ваши скрипты должны выполняться немедленно и не имеют зависимостей, используйте
async. - Если ваши скрипты должны ожидать парсинга и зависят от других скриптов и/или наличия DOM, загружайте их с помощью
deferи помещайте соответствующие элементы<script>в том порядке, в котором вы хотите, чтобы браузер их выполнял.
Отказ от модуля
Браузеры, поддерживающие значение module для атрибута type, игнорируют любые скрипты с атрибутом nomodule . Это позволяет использовать модульные скрипты, предоставляя резервные скрипты с отметкой nomodule для браузеров, которые не поддерживают модули.
<script type="module" src="main.js"></script> <script nomodule src="fallback.js"></script>
Импортирование модулей с помощью importmap
При импортировании модулей в скриптах, если вы не используете функцию type=importmap, каждый модуль должен импортироваться с помощью спецификатора модуля, который является либо абсолютным, либо относительным URL-адресом. В примере ниже первый спецификатор модуля ("./shapes/square.js") разрешается относительно базового URL-адреса документа, а второй — это абсолютный URL-адрес.
import { name as squareName, draw } from "./shapes/square.js"; import { name as circleName } from "https://example.com/shapes/circle.js";
Карта импорта позволяет предоставить отображение, которое, если оно совпадает, может заменить текст в спецификаторе модуля. В карте импорта ниже определены ключи square и circle, которые могут использоваться в качестве псевдонимов для спецификаторов модулей, показанных выше.
<script type="importmap"> { "imports": { "square": "./shapes/square.js", "circle": "https://example.com/shapes/circle.js" } } </script>
Это позволяет импортировать модули, используя имена в спецификаторе модуля (вместо абсолютных или относительных URL-адресов).
import { name as squareName, draw } from "square"; import { name as circleName } from "circle";
Дополнительные примеры использования карт импорта см. в разделе Импортирование модулей с помощью карт импорта в руководстве по модулям JavaScript.
Вставка данных в HTML
Вы также можете использовать элемент <script> для вставки данных в HTML с помощью рендеринга на стороне сервера, указав допустимый тип MIME, не являющийся JavaScript, в атрибуте type.
<!-- Generated by the server --> <script id="data" type="application/json"> { "userId": 1234, "userName": "Maria Cruz", "memberSince": "2000-01-01T00:00:00.000Z" } </script> <!-- Static --> <script> const userInfo = JSON.parse(document.getElementById("data").text); console.log("User information: %o", userInfo); </script>
Блокировка рендеринга до тех пор, пока скрипт не будет загружен и выполнен
Вы можете включить маркер render в атрибуте blocking; рендеринг страницы будет заблокирован до тех пор, пока скрипт не будет загружен и выполнен. В примере ниже мы блокируем рендеринг асинхронного скрипта, чтобы скрипт не блокировал парсинг, но гарантировал его оценку до начала рендеринга.
<script blocking="render" async src="async-script.js"></script>
Технический обзор
| Категории контента | Метаданные, Поток содержимого, Фразирование. |
|---|---|
| Разрешенный контент | Динамический скрипт, такой как text/javascript. |
| Пропуск тега | Нет, и открывающий, и закрывающий теги обязательны. |
| Разрешенные родительские элементы | Любой элемент, принимающий метаданные или любой элемент, принимающий фразирование. |
| Неявная роль ARIA | Нет соответствующей роли |
| Разрешенные роли ARIA | Нет role разрешено |
| Интерфейс DOM | HTMLScriptElement |
Спецификации
| Спецификация |
|---|
| Стандарт HTML # the-script-element |
Совместимость с браузерами
| Рабочий стол | Мобильный | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на IOS | Samsung Internet | WebView Android | |
script |
1 | 12 | 1Начиная с Firefox 4, вставка элементов <script>, созданных с помощью вызоваdocument.createElement("script"), больше не принудительно выполняется в порядке вставки. Это изменение позволяет Firefox правильно соблюдать спецификацию. Чтобы внешние скрипты, вставленные в скрипте, выполнялись в порядке их вставки, установите .async=false на них. |
≤12.1 | 3 | 18 | 4 | ≤12.1 | 2 | 1.0 | 4.4 |
async |
1 | 12 | 3.6 | 15 | ≤4 | 18 | 4 | 14 | ≤3.2 | 1.0 | 4.4 |
attributionsrc |
117 | 117 | Нет | 103 | Нет | 117 | Нет | 78 | Нет | 24.0 | 117 |
blocking |
105 | 105 | Нет | 91 | Нет | 105 | Нет | 72 | Нет | 20.0 | 105 |
crossorigin |
19 | 14 | 14 | 12 | 25 | 14 | 12 | 1.5 | 4.4 | ||
defer |
1Chrome не откладывает скрипты с атрибутомdefer при предоставлении страницы как XHTML (application/xhtml+xml), см. ошибку 611136 и ошибку 874749 |
12 | 3.5С Firefox 3.6 атрибутdefer игнорируется для скриптов без атрибута src. Однако в Firefox 3.5 даже встроенные скрипты откладываются, если установлен атрибут defer. |
15Opera не откладывает скрипты с атрибутомdefer при предоставлении страницы как XHTML (application/xhtml+xml), см. ошибку 611136 и ошибку 874749 |
3 | 18Chrome не откладывает скрипты с атрибутомdefer при предоставлении страницы как XHTML (application/xhtml+xml), см. ошибку 611136 и ошибку 874749 |
4 | 14Opera не откладывает скрипты с атрибутомdefer при предоставлении страницы как XHTML (application/xhtml+xml), см. ошибку 611136 и ошибку 874749 |
2 | 1.0Samsung Internet не откладывает скрипты с атрибутомdefer при предоставлении страницы как XHTML (application/xhtml+xml), см. ошибку 611136 и ошибку 874749 |
4.4Chrome не откладывает скрипты с атрибутомdefer при предоставлении страницы как XHTML (application/xhtml+xml), см. ошибку 611136 и ошибку 874749 |
fetchpriority |
101 | 101 | Нет | Нет | 17.2 | 101 | Нет | 70 | 17.2 | 19.0 | 101 |
integrity |
45 | 17 | 43 | 32 | 11.1 | 45 | 43 | 32 | 11.3 | 5.0 | 45 |
nomodule |
61 | 16 | 60 | 48 | 11 | 61 | 60 | 45 | 11 | 8.0 | 61 |
referrerpolicy |
70 | ≤79 | 65 | 57 | 14 | 70 | 65 | 49 | 14 | 10.0 | 70 |
src |
1 | 12 | 1 | 15 | ≤4 | 18 | 4 | 14 | ≤3.2 | 1.0 | 4.4 |
type |
1 | 12 | 1 | 15 | ≤4 | 18 | 4 | 14 | ≤3.2 | 1.0 | 4.4 |
См. также
© 2005–2023 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script