<script>: Елемент сценарію
{{HTMLSidebar}}
Елемент HTML <script>
(сценарій) застосовується для вбудовування виконуваного коду чи даних; зазвичай це використовується для вбудовування чи посилання на код JavaScript. Елемент <script>
також може застосовуватися з іншими мовами, як то GLSL – мовою програмування шейдерів WebGL, та JSON.
Категорії вмісту | Вміст метаданих, потоковий вміст, оповідальний вміст. |
---|---|
Дозволений вміст | Динамічний сценарій, як то text/javascript . |
Упускання тегів | Немає, обидва: і початковий, і кінцевий теги — обов\'язкові. |
Дозволені батьківські елементи | Будь-який елемент, що приймає вміст метаданих, або ж будь-який елемент, що приймає оповідальний вміст. |
Неявна роль ARIA | Відповідної ролі немає |
Дозволені ролі ARIA | Дозволених ролей немає |
Інтерфейс DOM | HTMLScriptElement |
Атрибути
Цей елемент приймає глобальні атрибути.
async
Для класичних сценаріїв, коли присутній атрибут
async
, то такий класичний скрипт отримується паралельно до розбору сторінки, і виконується відразу, коли стає доступним.Для модульних сценаріїв, якщо присутній атрибут
async
, то сценарії та всі їх залежності виконуються в черзі відкладених, таким чином, вони будуть отримані паралельно до розбору сторінки, і виконані відразу, коли стануть доступними.Цей атрибут дає змогу усунути проблему JavaScript, що блокує розбір сторінки: браузеру не потрібно завантажувати й виконувати сценарії до продовження розбору.
defer
в цьому випадку має подібну дію.Це булів атрибут: присутність булевого атрибута відповідає значенню істинності, а його відсутність – значенню хибності.
Дивіться Сумісність із браузерами для отримання приміток щодо підтримки браузерами. Дивіться також Асинхронні сценарії для asm.js.
crossorigin
Звичайні елементи
script
передаютьwindow.onerror
украй обмежену інформацію щодо сценаріїв, що не проходять стандартних перевірок CORS. Щоб дозволити логування помилок для сайтів, котрі використовують окремий домен для статичних мультимедійних файлів, слід використовувати цей атрибут. Дивіться Атрибути налаштувань CORS для отримання більш докладного пояснення його дійсних аргументів.defer
Цей булів атрибут встановлюється, аби вказати браузерові, що сценарій треба виконувати після розбору сторінки, але до викидання події
DOMContentLoaded
.Сценарії, що мають атрибут
defer
, затримуватимуть викидання подіїDOMContentLoaded
, поки не будуть завантажені й не завершать виконання.Застереження: Цей атрибут не повинен застосовуватися, якщо атрибут
src
– відсутній (наприклад, у вбудованих сценаріїв); в такому випадку він не матиме дії.Атрибут
defer
не має дії на модульних сценаріях: вони відкладаються усталено.Сценарії з атрибутом
defer
будуть виконуватися в тому порядку, в якому вони зустрічаються в документі.Цей атрибут дає змогу усунути проблему JavaScript, що блокує розбір сторінки: браузеру не потрібно завантажувати й виконувати сценарії до продовження розбору.
async
в цьому випадку має подібну дію.fetchpriority
Надає рекомендацію щодо відносного пріоритету отримання зовнішнього сценарію. Дозволені значення:
high
Сигналізує про високий пріоритет отримання відносно інших зовнішніх сценаріїв.
low
Сигналізує про низький пріоритет отримання відносно інших зовнішніх сценаріїв.
auto
Усталене значення: сигналізує про автоматичне визначення пріоритету отримання відносно інших зовнішніх сценаріїв.
integrity
Цей атрибут містить супутні метадані, котрі користувацький агент може використати для перевірки того, що отриманий ресурс був доставлений без неочікуваних втручань. Дивіться Цілісність підресурсу.
nomodule
Цей булів атрибут встановлюється, аби вказати, що сценарій не повинен виконуватися в браузерах, що підтримують модулі ES; може використовуватися для надання запасних сценаріїв старішим браузерам, що не підтримують модульний код JavaScript.
nonce
Криптографічне одноразове значення, що дозволяє сценарії в 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 – перелічені в специфікації типів медіа IANA
module
Це значення призводить до розгляду коду як модуля JavaScript. Обробка вмісту сценарію – відкладається. Атрибути
charset
іdefer
– не діють. Про застосуванняmodule
– дивіться наш посібник Модулі JavaScript. На відміну від класичних, модульні сценарії вимагають, для отримання з іншого походження, використання протоколу CORS.importmap
Це значення вказує на те, що тіло елемента вміщає карту імпортування. Карта імпортування – об'єкт JSON, котрий розробники можуть використовувати для контролю того, як браузер розв'язує модульні специфікатори при імпорті модулів JavaScript.
- Будь-яке інше значення
Вміст всередині розглядається як масив даних і не обробляється самим браузером. Розробники повинні використовувати для позначення масивів даних дійсні типи MIME, котрі не є типами MIME JavaScript. Вся решта атрибутів буде проігнорована, включно з атрибутом
src
.
blocking
Цей атрибут явно вказує, що певні операції повинні бути заблоковані отриманням такого сценарію. Операції до блокування повинні бути розділеним пробілами списком атрибутів блокування, перелічених нижче.
render
: Візуалізація вмісту на екрані – заблокована.
Нерекомендовані атрибути
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("Привіт, світе!");
</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 при серверному чині шляхом задання дійсного не-JavaScript типу MIME в атрибуті type
.
<!-- Породжено сервером -->
<script id="data" type="application/json">
{
"userId": 1234,
"userName": "Марія Карімназарова",
"memberSince": "2000-01-01T00:00:00.000Z"
}
</script>
<!-- Статичне -->
<script>
const userInfo = JSON.parse(document.getElementById("data").text);
console.log("Інформація про користувача: %o", userInfo);
</script>
Блокування візуалізації до отримання й виконання сценарію
Лексему render
можна включити в атрибут blocking
; тоді візуалізація сторінки буде заблокована, поки сценарій не буде отриманий та виконаний. У прикладі нижче візуалізація блокується асинхронним сценарієм, щоб сценарій не блокував розбору коду, але гарантовано виконався до початку візуалізації.
<script blocking="render" async src="async-script.js"></script>
Специфікації
Специфікація |
---|
HTML Standard
(HTML)
# the-script-element |
Сумісність із браузерами
desktop | mobile | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
script
|
Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1 | Internet Explorer Full support Yes | Opera Full support Yes | Safari Full support Yes | WebView Android Full support Yes | Chrome Android Full support Yes | Firefox for Android Full support 4 | Opera Android Full support Yes | Safari on iOS Full support Yes | Samsung Internet Full support Yes |
async
|
Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1 | Internet Explorer Full support Yes | Opera Full support Yes | Safari Full support Yes | WebView Android Full support Yes | Chrome Android Full support Yes | Firefox for Android Full support 4 | Opera Android Full support Yes | Safari on iOS Full support Yes | Samsung Internet Full support Yes |
crossorigin
|
Chrome Full support 30 | Edge Full support 18 | Firefox Full support 13 | Internet Explorer No support No | Opera Full support 12 | Safari Full support Yes | WebView Android Full support Yes | Chrome Android Full support Yes | Firefox for Android Full support 14 | Opera Android Compatibility unknown; please update this. ? | Safari on iOS Compatibility unknown; please update this. ? | Samsung Internet Full support Yes |
defer
|
Chrome Full support Yes | Edge Full support 12 | Firefox Full support 3.5 | Internet Explorer Full support 10 | Opera Full support Yes | Safari Full support Yes | WebView Android Full support Yes | Chrome Android Full support Yes | Firefox for Android Full support 4 | Opera Android Full support Yes | Safari on iOS Full support Yes | Samsung Internet Full support Yes |
fetchpriority
|
Chrome Full support 101 | Edge Full support 101 | Firefox No support No | Internet Explorer No support No | Opera No support No | Safari No support No | WebView Android Full support 101 | Chrome Android Full support 101 | Firefox for Android No support No | Opera Android Full support 70 | Safari on iOS No support No | Samsung Internet Full support 19.0 |
integrity
|
Chrome Full support 45 | Edge Full support 17 | Firefox Full support 43 | Internet Explorer No support No | Opera Full support Yes | Safari Full support 11.1 | WebView Android Full support 45 | Chrome Android Full support 45 | Firefox for Android Full support 43 | Opera Android Compatibility unknown; please update this. ? | Safari on iOS Full support 11.3 | Samsung Internet Full support 5.0 |
language
|
Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1 | Internet Explorer Full support Yes | Opera Full support Yes | Safari Full support Yes | WebView Android Full support Yes | Chrome Android Full support Yes | Firefox for Android Full support 4 | Opera Android Full support Yes | Safari on iOS Full support Yes | Samsung Internet Full support Yes |
nomodule
|
Chrome Full support 61 | Edge Full support 16 | Firefox Full support 60 | Internet Explorer No support No | Opera Full support 48 | Safari Full support 11 | WebView Android Full support 61 | Chrome Android Full support 61 | Firefox for Android Full support 60 | Opera Android Full support 45 | Safari on iOS Full support 11 | Samsung Internet Full support 8.0 |
referrerpolicy
|
Chrome Full support 70 | Edge Full support 79 | Firefox Full support 65 | Internet Explorer No support No | Opera Full support Yes | Safari Full support 13.1 | WebView Android Full support 70 | Chrome Android Full support 70 | Firefox for Android Full support 65 | Opera Android Compatibility unknown; please update this. ? | Safari on iOS Full support 13.4 | Samsung Internet Full support 10.0 |
src
|
Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1 | Internet Explorer Full support Yes | Opera Full support Yes | Safari Full support Yes | WebView Android Full support Yes | Chrome Android Full support Yes | Firefox for Android Full support 4 | Opera Android Full support Yes | Safari on iOS Full support Yes | Samsung Internet Full support Yes |
text
|
Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1 | Internet Explorer Full support Yes | Opera Full support Yes | Safari Full support Yes | WebView Android Full support Yes | Chrome Android Full support Yes | Firefox for Android Full support 4 | Opera Android Full support Yes | Safari on iOS Full support Yes | Samsung Internet Full support Yes |
type
|
Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1 | Internet Explorer Full support Yes | Opera Full support Yes | Safari Full support Yes | WebView Android Full support Yes | Chrome Android Full support Yes | Firefox for Android Full support 4 | Opera Android Full support Yes | Safari on iOS Full support Yes | Samsung Internet Full support Yes |
type.importmap
|
Chrome Full support 89 | Edge Full support 89 | Firefox Full support 108 | Internet Explorer No support No | Opera Full support 75 | Safari No support No | WebView Android Full support 89 | Chrome Android Full support 89 | Firefox for Android Full support 108 | Opera Android Full support 63 | Safari on iOS No support No | Samsung Internet Full support 15.0 |
type.module
|
Chrome Full support 61 | Edge Full support 79 | Firefox Full support 60 | Internet Explorer No support No | Opera Full support 48 | Safari Full support 10.1 | WebView Android Full support 61 | Chrome Android Full support 61 | Firefox for Android Full support 60 | Opera Android Full support 45 | Safari on iOS Full support 10.3 | Samsung Internet Full support 8.0 |