本記事にはプロモーション(アフィリエイト広告)を含みます。
この記事で分かること
- scriptタグの基本的な書き方
- head・bodyへの置き方と、実行されるタイミング
- 外部ファイルを読み込む方法
- defer・async・moduleの違いと選び方
- 表示されないときの確認方法と、最小の動作例
JavaScriptをHTMLに組み込むには、scriptタグを使います。どこに置くか、deferやasyncを付けるかによって、読み込みや実行のタイミングが変わります。
Webページに動きや操作を加えるための指示を書く言葉です。
Webページの見出しや文章、ボタンなどを組み立てるための書き方です。
HTMLの中でJavaScriptを動かす場所を示す目印です。JavaScriptをその場に書く方法と、別のファイルを読み込む方法があります。
この記事では、通常のscriptタグと、別ファイルに書いたJavaScriptを読み込む場合を中心に説明します。まず配置場所と実行順を整理し、その後、手元で動かせる例を紹介します。
山かっこで囲んだ記号を使って、ページの部品や役割を示す書き方です。たとえば、
<p> は文章のまとまりを表します。
scriptタグの基本的な書き方
JavaScriptをHTMLの中に直接書く場合は、開始タグと終了タグの間に記述します。
<script>
document.getElementById("message").textContent = "JavaScriptが動きました";
</script>
この例では、ページにある「message」という名前の場所に文字を入れます。ページの部品がまだ読み込まれていないタイミングでこの処理を実行すると、対象が見つからずエラーになることがあります。
Webページの見出しや文章、ボタンなどを、JavaScriptから見つけたり変更したりできるようにした仕組みです。
headとbodyのどちらに置くか
headに置いた通常のscriptタグは、読み込み中にその場所へ来ると、JavaScriptの読み込みと実行が終わるまでHTMLの読み取りを一時停止します。ページ内の部品を使う処理は、部品が読み込まれる前に動くと対象を見つけられません。
ページの題名や設定など、画面に表示する本文以外の情報を書く場所です。
見出し、文章、ボタンなど、ページに表示する内容を書く場所です。
この説明は、async・deferを付けていない通常のscriptタグについてです。外部ファイルを読み込むscriptタグにこれらの属性を付けた場合や、module形式では、動作が異なります。
タグに追加して、読み込み方などの条件を指定する情報です。たとえば、
src は読み込むファイルの場所を指定します。
配置方法は、次のように選べます。
- ページの部品を使わない短い処理なら、置き場所に応じた実行タイミングを確認して使います。
- ページの部品を使う処理なら、body内の対象部品より後に置く方法があります。
- 外部ファイルをheadから読み込むなら、通常のscriptではdeferを使う方法があります。
defer・async・moduleの違い
deferとasyncは、外部ファイルを読み込む通常のscriptタグで使う属性です。読み込み中もHTMLの読み取りを続け、JavaScriptを実行するタイミングを変えます。
外部ファイルの読み込みをHTMLの読み取りと並行して進め、HTMLを読み終えた後にJavaScriptを動かす指定です。deferを付けた通常のscriptタグが複数ある場合は、HTMLに書いた順に実行されます。
外部ファイルの読み込みをHTMLの読み取りと並行して進め、読み込みが終わったものから動かす指定です。複数ある場合、HTMLに書いた順に実行されるとは限りません。
どちらも外部ファイルを読み込む場合の指定です。HTML内に直接書いた通常のscriptタグでは、deferやasyncを付けても同じ動作にはなりません。
module形式では、外部ファイルは基本的にHTMLの読み取り後に実行されます。asyncを付けた場合は、読み込みが終わった時点で実行されることがあります。module形式のscriptタグにdeferを付けても、deferによる追加の動作はありません。
JavaScriptを、別々のファイルに分けて読み込み、組み合わせて使う形式です。scriptタグでは、
type="module" と指定します。
| 書き方 | HTML読み取り中の動き | 実行タイミング・順番 |
|---|---|---|
| 通常の外部script | その場所で一時停止 | 読み込み後、すぐ実行 |
| 外部scriptにdefer | 読み取りを続ける | HTMLを読み終えた後。複数あれば記述順 |
| 外部scriptにasync | 読み取りを続ける | 読み込み完了後。複数の実行順は一定しない |
| module形式 | 読み取りを続ける | 基本はHTMLを読み終えた後。asyncを付けると変わる |
ほかのJavaScriptファイルの処理が終わってから動かす必要がある場合は、asyncではなくdeferを検討します。読み込み順に関係しない独立した処理なら、asyncが使える場合があります。
複数のファイルをHTMLに書いた順に実行でき、HTMLの読み取りも止めずに済みます。module形式や、実行順に関係しない処理では条件が異なります。
外部ファイルを読み込む方法
JavaScriptを別のファイルに保存し、scriptタグのsrcにその場所を書けば読み込めます。HTMLとJavaScriptを分けると、どこに何を書くか整理しやすくなります。一方、ファイルを増やすため、保存場所や指定する場所の確認が必要です。
HTMLとは別に保存して、必要なときに読み込むファイルです。JavaScriptのファイル名は、通常
.jsで終わります。
<script src="./main.js" defer></script>
./main.jsは、HTMLファイルと同じ場所にあるmain.jsを指定しています。../main.jsなら、ひとつ上の場所にあるファイルを指定します。
ファイルがどこにあるかを示す書き方です。住所をたどって目的の場所を探すように、フォルダーの位置を指定します。
今いるファイルの場所を基準に、目的のファイルまでの位置を書く方法です。
./main.jsや../main.jsが例です。
同じHTMLを別の場所へ移すと、相対パスではJavaScriptファイルを見つけられなくなることがあります。HTMLとJavaScriptファイルの位置関係を確認してください。


HTMLとJavaScriptを一緒に動かす
次の例では、HTMLとJavaScriptを同じフォルダーに保存します。ページを開くと案内文が表示され、ボタンを押すと文章が変わります。
1. HTMLファイルを作る
次の内容をindex.htmlという名前で保存します。
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>scriptタグの練習</title>
<script src="./main.js" defer></script>
</head>
<body>
<p id="message">ボタンを押してください。</p>
<button id="change-button">文章を変える</button>
</body>
</html>
2. JavaScriptファイルを作る
同じフォルダーにmain.jsを作り、次の内容を保存します。
const button = document.getElementById("change-button");
const message = document.getElementById("message");
button.addEventListener("click", function () {
message.textContent = "JavaScriptが動きました。";
});
HTMLを読み終えた後にJavaScriptが動くよう、scriptタグにdeferを付けています。そのため、JavaScriptがボタンや文章を探すときには、HTML内の部品が読み込まれています。
addEventListenerは、ボタンが押されたときに行う処理を登録する書き方です。ここでは、ボタンが押されたら案内文を書き換えます。
3. ブラウザで確認する
index.htmlとmain.jsを同じフォルダーに保存します。index.htmlをブラウザで開きます。- 最初に「ボタンを押してください。」と表示されることを確認します。
- 「文章を変える」ボタンを押し、「JavaScriptが動きました。」に変わることを確認します。
期待される結果:ページを開いた直後は「ボタンを押してください。」、ボタンを押した後は「JavaScriptが動きました。」と表示されます。
ChromeやSafariのように、Webページを開いて見るためのアプリです。
動かないときに確認すること
ボタンを押しても文章が変わらない
まず、HTMLとJavaScriptのファイル名、保存場所、scriptタグのsrcの指定を確認します。例では、両方のファイルが同じフォルダーにあり、指定が./main.jsになっている必要があります。
次に、HTML内のidとJavaScript内の文字が一致しているか確認します。たとえば、HTMLがid="change-button"なら、JavaScriptも"change-button"を探す必要があります。
headに置いたコードで対象が見つからない
通常のscriptタグをheadに置き、deferを付けずにページ内の部品を探すと、その部品がまだ読み込まれていないことがあります。scriptタグにdeferを付けるか、対象となる部品の後にscriptタグを移動します。
<head>
<script src="./main.js" defer></script>
</head>
エラーが出た場合は、ブラウザの開発者向け画面で、エラーの内容とファイル名を確認します。表示内容はブラウザによって異なることがあるため、文面だけでなく、示されたファイルや行も見てください。
指示どおりに処理できなかったことを知らせる表示です。どのファイルのどのあたりで問題が起きたかを探す手がかりになります。
Webページを作る人が、ページの状態や問題の表示を確認するためのブラウザの画面です。開き方はブラウザによって異なります。
複数のファイルの順番が崩れる
asyncを付けた外部ファイルは、読み込みが終わったものから実行されます。先に書いたファイルが先に実行されるとは限りません。前のファイルの処理を使う必要があるときは、deferを使う方法を検討してください。
<script src="./first.js" defer></script>
<script src="./second.js" defer></script>
この通常のscriptタグでは、HTMLを読み終えた後に、first.js、second.jsの順で実行されます。各ファイルが存在することと、ファイル内で使う名前が正しく設定されていることも確認してください。
公式資料で仕様を確認する
属性の適用条件や実行タイミングを詳しく確認したい場合は、仕様の説明も参照してください。
- WHATWG HTML Standard:script要素(HTMLのscriptタグに関する仕様)
- MDN:script要素(属性や使用例の説明)
この記事案に対して、特定のブラウザ・バージョンを使った動作確認は行われていません。公開前に、掲載したコードを実行し、確認したブラウザ名・バージョンと確認日を記録してください。
JavaScriptを順番に学ぶ
scriptタグの基本を確認したら、外部ファイルの読み込み方や、ページの部品を操作する方法へ進むと理解を深められます。JavaScript基礎ロードマップでは、学ぶ順番に沿って記事を確認できます。
JavaScriptを基礎から学びたい方へ PR
scriptタグの使い方に加えて、JavaScriptの文法やページ操作まで順に学びたい人向けの選択肢です。この記事の例だけで必要な知識がそろうわけではないため、より広い範囲を学びたい場合に検討してください。
これからのJavaScriptの教科書
JavaScriptの基本文法から、ページ操作、イベント、非同期処理などを扱う書籍です。掲載情報では、サンプルコードを試しながら幅広い内容を学ぶ構成とされています。
向いている人:JavaScriptを基礎から体系的に学びたい人や、記事で扱う範囲の先へ進みたい人。
注意点:全608ページのため、要点だけを短時間で確認したい人には分量が多い場合があります。対象はECMAScript 2023までです。
scriptタグに関するよくある質問
scriptタグはheadとbodyのどちらに書けばよいですか?
外部ファイルをheadから読み込むなら、通常のscriptタグではdeferを使う方法があります。body内の部品を使う処理では、部品が読み込まれた後に動く配置かどうかも確認してください。
deferとasyncはどう使い分けますか?
複数の外部ファイルをHTMLに書いた順に実行したい場合はdeferを検討します。asyncは読み込みが終わったものから実行されるため、実行順に依存しない処理に向いています。
HTMLに直接書いたJavaScriptにもdeferを付けられますか?
HTML内に直接書いた通常のscriptには、deferによる実行タイミングの変更はありません。対象の部品より後に置くか、外部ファイルにしてdeferを使います。
module形式ではdeferが必要ですか?
module形式の外部ファイルは、基本的にHTMLを読み終えた後に実行されます。deferを付けても、deferによる追加の動作はありません。
scriptタグは複数書いてもよいですか?
複数書けます。外部ファイルの実行順が必要な場合は、通常のscriptにdeferを付ける方法や、module形式の仕様を確認してください。asyncでは、複数のファイルの実行順は保証されません。
まとめ
- scriptタグでJavaScriptをHTMLに組み込める
- 通常のscriptをheadに置くと、HTMLの読み取りが一時停止する場合がある
- 外部ファイルのdeferは、HTMLを読み終えた後に実行する
- asyncは読み込みが終わったものから実行され、順番は決まらない
- module形式やHTML内に直接書く場合は、defer・asyncと動作が異なる
- 動かないときは、ファイルの場所、名前、HTML内の部品名を確認する
まずはHTMLとJavaScriptのファイルを同じフォルダーに置き、例を動かしてみてください。次は外部ファイルの読み込み方と、JavaScript基礎ロードマップを確認しましょう。