<script>: элемент для написания скриптов
HTML Элемент <script> используется для встраивания или подключения исполняемого JavaScript кода. Элемент <script> также может использоваться с другими языками, такими как GLSL (en-US) от WebGL.
| Content categories | Метаданные, Потоковый контент, Фразовый контент. |
|---|---|
| Допустимый контент | Динамический скрипт, используя атрибут text/javascript . |
| Пропуск тегов | Нет. Открывающий и закрывающий теги обязательны |
| Допустимые родители | Любые элементы в которых разрешены метаданные или фразовый контент |
| Допустимые ARIA-роли | нет |
| DOM-интерфейс | HTMLScriptElement |
Атрибуты
Это логический атрибут, указывающий браузеру, если возможно, загружать скрипт, указанный в атрибуте src , асинхронно.
Предупреждение: Атрибут async не будет оказывать никакого эффекта, если атрибут src отсутствует. Обычно браузеры загружают <script> синхронно, (т.е. async=»false» ) во время разбора документа. Динамически вставленный <script> (используя, например, document.createElement ) по умолчанию загружаются браузером асинхронно, поэтому для включения синхронной загрузки (т.е. когда скрипты загружаются в порядке их вставки) укажите async=»false» .
Обычные элементы тега script передают мало информации в window.onerror для скриптов, которые не проходят проверку CORS (en-US) . Чтобы разрешить ведение журнала ошибок сайта, которые используют отдельный домен для статических файлов (например, изображение, видео-файл, CSS-стили или Javascript-код), используйте атрибут crossorigin . Посмотрите статью «настройки атрибутов CORS» для более наглядного объяснения его допустимых аргументов.
Это логический атрибут, указывающий браузеру, что скрипт должен выполняться после разбора документа, но до события DOMContentLoaded (en-US) . Скрипты с атрибутом defer будут предотвращать запуск события DOMContentLoaded (en-US) до тех пор, пока скрипт не загрузится полностью и не завершится его инициализация.
Предупреждение: Атрибут defer не будет оказывать никакого эффекта, если атрибут src отсутствует. Чтобы достигнуть такого же эффекта для динамически вставленных скриптов используйте async=false . Скрипты с атрибутом defer будут выполняться в том порядке, в котором они появились при разборе документа.
Этот атрибут содержит встроенные метаданные, которые агент пользователя (браузер) может использовать для проверки того, что выбранный ресурс был доставлен без непредвиденных манипуляций. Смотрите Целостность субресурса (en-US) .
Булевый атрибут, который устанавливается для того, чтобы скрипт не выполнялся в браузерах, поддерживающих ES6-модули (англ.). Таким образом, может быть использован для предоставления резервных сценариев в старых браузерах, которые не поддерживают модульный код JavaScript.
Криптографический одноразовый номер (номер, используемый один раз) для внесения встроенных скриптов в белый список в script-src Content-Security-Policy (en-US) . Сервер должен генерировать уникальное одноразовое значение каждый раз, когда он передает политику. Крайне важно предоставить одноразовый номер, который нельзя угадать, поскольку в противном случае обход политики ресурса является тривиальным.
Определяет URI внешнего скрипта; является альтернативой встраиванию скрипта непосредственно в документ.
Предупреждение: Если у элемента script будет указан атрибут src , то он не должен иметь встроенный скрипт между тегами.
Как и атрибут textContent , этот атрибут задает текстовое содержимое элемента. Однако, в отличие от атрибута textContent , этот атрибут оценивается как исполняемый код после того, как узел вставлен в DOM.
Этот атрибут указывает тип представленного скрипта. Значение этого атрибута будет находиться в одной из следующих категорий:
- Атрибут не установлен (по-умолчанию), пустая строка или установлен как MIME-тип JavaScript
- : Обозначает, что скрипт является «классическим скриптом», содержащим JavaScript-код. Рекомендуется не указывать MIME-тип, а пропускать атрибут вообще. MIME-типы JavaScript указаны в спецификации.
- : Данное значение даёт браузеру инструкцию, что код является JavaScript-модулем. Обработка содержимого скрипта отложенная. Атрибуты charset и defer игнорируются. Для дополнительной информации по использованию module , смотрите руководство по JavaScript-модулям. В отличие от классчических скриптов, модули требуют использования CORS-протокола для cross-origin загрузок.
- : Данное значение сигнализирует о том, что содержимое тега является словарём импортов. Словарь импортов — это JSON-объект, который может использоваться для задания алиасов при импорте JavaScript-модулей.
Устаревшие атрибуты
Если присутствует, его значение должно соответствовать «utf-8» без учета регистра ASCII. И в том, и в другом случае нет необходимости указывать атрибут charset, поскольку документы должны использовать UTF-8, а элемент script наследует свою кодировку символов от документа.
Как и атрибут type , этот атрибут определяет используемый язык сценариев. Однако, в отличие от type , возможные значения language никогда не были стандартизированы. Вместо него следует использовать атрибут type .
Примечания
Элемент <script> без указания атрибутов async , defer или type=»module» , а также встроенный скрипт, загружается и выполняется сразу, до того как браузер продолжит разбор документа.
Для обработки скрипт должен иметь тип данных text/javascript , но браузеры снисходительны и блокируют обработку только в том случае, если скрипт представляет данные одного из типов: изображение ( image/* ); видео ( video/* ); аудио ( audio/* ); или text/csv . Если скрипт заблокирован, элементу отправляется событие error (en-US) , если не было отправлено событие load (en-US) .
Примеры
Основное использование
Эти примеры показывают как импортировать скрипт используя элемент <script> в HTML4 и HTML5.
Фолбэк-модуль
Браузеры, поддерживающие использование значения module для атрибута type , игнорируют любые скрипты с атрибутом nomodule . Это разрешает использовать модульные скрипты, и в тот же самый момент позволяет использовать nomodule- скрипты для браузеров без поддержки модульных скриптов.
7 Must-know attributes of <script> for every front-end developer

All of us are using <script> elements in web development to a great extent every day. Even I am using it for years now.
When it comes to including JavaScript code into an HTML page, the <script> tag is the only way to do it. And every single front-end developer uses this. But what shocked me was the hidden or lesser-known powers of <script> tag which no trainer explains anywhere. But these are super useful when it boils down to the specific use cases of HTML and javascript rendering.
In my 6+ years of web development career what I learned was the same which every single student understands when it comes to learning HTML or JavaScript. But a few years ago while researching a problem, I got to know the full potential of the <script> tag.
A couple of years back, once I was coding late at night for a deadline to achieve. I came across a very interesting problem when I got to understand one of my JavaScript files was super heavy to be loaded on the index page of the website. And that was reducing the page loading speed.
I researched a lot and came to know that there are some superpowers that <script> tags bring themselves, which browsers understand completely.
So to guide the web developers, I am writing a detailed article on the <script> tag that seems very small, but has a lot of use cases when comes to front-end web pages.
So below are the questions and doubts that as a front-end web developer I always had in my initial days. Every Front-End Developer can relate to the same. Just read this article till the very last line to unleash all your doubtful queries and know the complete details of the <script> tag.
How many <script> tags can be placed on one page?
You can place any number of scripts on a single HTML page. The script can be placed inside the <body> and <head> tags in HTML.
Which one is better for <script> placement — <body> or <head>?
It is always better to place <script> just before closing body tag (i.e. </body>) rather than <head> section.
HTML pages load from top to bottom in the web browser. So if we put our <script> in the <head> then it will take time to load the page and the HTML element will not appear on the screen until the <script> loads completely. That is not a good user experience as it’s making the user wait unnecessarily. If the script will be at last, then the HTML tags will render easily and will not be blocked by the <script>.
Also, if there will be an error on the script then the user will not get the error at the time of rendering other elements.
Standard code for Script inside the HTML
Attributes of the <script> tag
1. src
By using the src attribute, you can embed the external file of javascript. The value of the src attribute should be URL type. The extension of the external file should be in js format.
2. type
The type attribute indicates the value of the script type. It specifies the media type of script file (MIME type).
Here is the list of types that are used as a value of type attribute :
- text/JavaScript
- application/ecmascript
- application/JavaScript
- text/vbscript
By using the type attribute, the browser determines the type of file on which the script will run. However, in HTML5 type is no longer required.
3. Async
This is a boolean attribute and can be used for only external scripts.
In general, a script is downloaded and executed immediately. So it blocks the parsing until the script is completely executed.
But if “async” is present in the script tag then the script is downloaded in parallel while parsing the web page and executed as soon as it is available.Benefits of async:
- Scripts with async show up the content of the page immediately — async doesn’t block it.
- Other scripts don’t wait for async scripts, and async scripts don’t wait for them.
4. Defer
Just like async, defer downloads the script in parallel while parsing the page, but unlike async, it executes the loaded script after the page has finished parsing. This attribute is mostly for external scripts only.
Benefits of defer:
- Scripts with defer never block the page.
- Scripts with defer always execute the script when the DOM is ready to avoid errors or conflicts.
In practice, defer is used for scripts that need the whole DOM to be executed first. And async is used for independent scripts, like counters or ads. And their relative execution order does not matter.
5. crossorigin
Browsers don’t support the resources loaded from a different origin than the current page and give HTTP CORS errors. By using the cross-origin attribute we can request a resource from another domain.
corssorigin instructs the browser to check for Access-Control headers and perform normal CORS access.
- anonymous — A cross-origin request is performed. No credentials are sent
- use-credentials — A cross-origin request is performed. Credentials are sent (e.g. a cookie, a certificate, an HTTP Basic authentication)
6. integrity
This attribute allows the browser to check the fetched script to ensure that the code is never loaded if the source has been manipulated.
It uses the hash value that the script file should contain. The browser downloads the file, then checks it, to make sure that it is a match with the hash in the integrity attribute. If it matches successfully, then only the file is used otherwise the file is blocked.
7. nomodule
This attribute specifies the script should not be executed in the browsers which support module scripts.
In modern user agents that support module scripts, the script element with the nomodule attribute will be ignored, and the script element with a type of “module” will be fetched and evaluated.
Hope you are reading this article, till this line. I am damn sure you can relate to all the above doubts and, have also found the attributes helpful with the <script> tag.
I hope it will add value to your learning and you are now more clear about the <script> powers and potential, if yes please do like, comment, and share with your colleagues to spread knowledge…
Привет, мир!
В этой части учебника мы изучаем собственно JavaScript, сам язык.
Но нам нужна рабочая среда для запуска наших скриптов, и, поскольку это онлайн-книга, то браузер будет хорошим выбором. В этой главе мы сократим количество специфичных для браузера команд (например, alert ) до минимума, чтобы вы не тратили на них время, если планируете сосредоточиться на другой среде (например, Node.js). А на использовании JavaScript в браузере мы сосредоточимся в следующей части учебника.
Итак, сначала давайте посмотрим, как выполнить скрипт на странице. Для серверных сред (например, Node.js), вы можете выполнить скрипт с помощью команды типа "node my.js" . Для браузера всё немного иначе.
Тег «script»
Программы на JavaScript могут быть вставлены в любое место HTML-документа с помощью тега <script> .
Вы можете запустить пример, нажав на кнопку «Play» в правом верхнем углу блока с кодом выше.
Тег <script> содержит JavaScript-код, который автоматически выполнится, когда браузер его обработает.
Современная разметка
Тег <script> имеет несколько атрибутов, которые редко используются, но всё ещё могут встретиться в старом коде:
Атрибут type : <script type=…>
Старый стандарт HTML, HTML4, требовал наличия этого атрибута в теге <script> . Обычно он имел значение type="text/javascript" . На текущий момент этого больше не требуется. Более того, в современном стандарте HTML смысл этого атрибута полностью изменился. Теперь он может использоваться для JavaScript-модулей. Но это тема не для начального уровня, и о ней мы поговорим в другой части учебника.
Атрибут language : <script language=…>
Этот атрибут должен был задавать язык, на котором написан скрипт. Но так как JavaScript является языком по умолчанию, в этом атрибуте уже нет необходимости.
Обёртывание скрипта в HTML-комментарии.
В очень древних книгах и руководствах вы сможете найти комментарии внутри тега <script> , например, такие:
Этот комментарий скрывал код JavaScript в старых браузерах, которые не знали, как обрабатывать тег <script> . Поскольку все браузеры, выпущенные за последние 15 лет, не содержат данной проблемы, такие комментарии уже не нужны. Если они есть, то это признак, что перед нами очень древний код.
Внешние скрипты
Если у вас много JavaScript-кода, вы можете поместить его в отдельный файл.
<script>¶
Тег <script> (от англ. script — скрипт, сценарий) предназначен для описания скриптов, может содержать ссылку на программу или её текст на определённом языке.
Скрипты могут располагаться во внешнем файле и связываться с любым HTML-документом. Такой подход позволяет использовать одни и те же общие функции на многих веб-страницах и ускоряет их загрузку, т. к. внешний файл кэшируется при первой загрузке, и скрипт вызывается быстрее при последующих вызовах.
<script> может располагаться в заголовке или теле HTML-документа в неограниченном количестве. В большинстве случаев местоположение скрипта никак не сказывается на работу программы. Однако скрипты, которые должны выполняться в первую очередь, обычно помещают в заголовок документа.
Синтаксис¶
Закрывающий тег обязателен.
Атрибуты¶
async¶
При наличии атрибута async браузер при возможности запускает скрипт асинхронно. Это означает, что указанный в атрибуте src файл будет выполняться без ожидания загрузки и отображения веб-страницы. В то же время и страница не ожидает результата выполнения скрипта, а продолжает загружаться как обычно.
Если задано сразу два атрибута — async и defer , то атрибут async игнорируется.
Синтаксис
Значения
Значение по умолчанию
По умолчанию этот атрибут выключен.
defer¶
Атрибут defer откладывает выполнение скрипта до тех пор, пока вся страница не будет загружена полностью. Работает только при наличии атрибута src .
Синтаксис
Значения
Значение по умолчанию
По умолчанию этот атрибут выключен.
Загружает файл со скриптом из внешнего файла. Как только внешние инструкции полностью загружаются, браузер обрабатывает их, словно они были внедрены в текущий документ. Файлы со скриптами JavaScript обычно имеют расширение js и могут размещаться в любом доступном месте.
Преимуществ использования внешних файлов несколько. Внешний файл после первого обращения сохраняется в кэше браузера и при последующих вызовах загружается быстрее. Кроме того, вызываемые функции удобно править в одном месте и код проще контролировать. Это особенно актуально, когда множество веб-страниц используют одни и те же скрипты.
Синтаксис
Значения
В качестве значения принимается полный или относительный путь к файлу. Файл должен иметь расширение .js.
Значение по умолчанию
Указывает MIME-тип для определённого языка.
Синтаксис
Значения
Атрибут type не чувствителен к регистру и обычно принимает следующие значения: