Встроенный (inline) JavaScript
JavaScript код пишется непосредственно в HTML-файле внутри тега <script>.
В <head> или <body>:
<!DOCTYPE html>
<html>
<head>
<title>Пример встроенного JS</title>
<script>
// Код выполнится при загрузке страницы
console.log("Скрипт в head выполнен!");
</script>
</head>
<body>
<h1>Привет, мир!</h1>
<script>
// Код выполнится, когда браузер дойдет до этого места
document.querySelector('h1').style.color = 'blue';
</script>
</body>
</html>Недостатки:
- Загромождает HTML-код
- Нельзя кэшировать отдельно
- Сложно поддерживать
Подключение внешнего файла (рекомендуется)
Самый правильный и распространенный способ — вынос кода в отдельный файл с расширением .js.
HTML (index.html):
<!DOCTYPE html>
<html>
<head>
<title>Внешний JS файл</title>
<!-- Подключение в head -->
<script src="script.js" defer></script>
</head>
<body>
<h1 id="title">Заголовок</h1>
<button onclick="changeText()">Нажми меня</button>
<!-- Подключение в конце body (альтернативный способ) -->
<!-- <script src="script.js"></script> -->
</body>
</html>JavaScript (script.js):
// Весь JavaScript код в отдельном файле
function changeText() {
document.getElementById('title').textContent = 'Текст изменен!';
console.log('Функция вызвана!');
}
// Код, который выполнится при загрузке
console.log('Внешний скрипт загружен');Атрибуты тега script
defer — отложенная загрузка (рекомендуется)
- Скрипт загружается параллельно с HTML
- Выполняется ПОСЛЕ полной загрузки DOM
- Сохраняется порядок выполнения скриптов
<script src="script.js" defer></script>
async — асинхронная загрузка
- Скрипт загружается параллельно с HTML
- Выполняется СРАЗУ после загрузки (не ждет DOM)
- Порядок выполнения не гарантирован
<script src="script.js" async></script>
Современные подходы и лучшие практики
Рекомендуемое расположение:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Лучшие практики</title>
<!-- Подключение стилей -->
<link rel="stylesheet" href="styles.css">
<!-- Подключение JS с defer -->
<script src="main.js" defer></script>
</head>
<body>
<!-- Контент страницы -->
<!-- Альтернатива: скрипты перед закрывающим </body> -->
<!-- <script src="main.js"></script> -->
</body>
</html>Несколько скриптов:
<!-- С defer - сохраняется порядок --> <script src="library.js" defer></script> <script src="app.js" defer></script> <!-- Выполнится: 1) library.js, 2) app.js --> <!-- С async - порядок не гарантирован --> <script src="widget1.js" async></script> <script src="widget2.js" async></script> <!-- Может выполниться widget2.js раньше widget1.js -->