Webページに「動き」を与えるJavaScript。
しかし、HTMLにどうやって埋め込めばよいかわからず、困っている人も多いでしょう。
そこでこの記事では、HTMLにJavaScriptを埋め込むための基本的な2つの方法から、Webサイトの表示速度を損なわないための応用的なテクニックまで、初心者の方にもわかりやすく丁寧に解説します。
【本記事の信頼性】
- 執筆者は元エンジニア
- 大手プログラミングスクールのWebディレクター兼ライターを経験
- 自らも地元密着型のプログラミングスクールを運営
プログラミングスクール
■Webエンジニアの育成に特化 ■自社開発企業への転職成功率がダントツ ■ハイスキルを求める人に最適 |
|
■サポートは半永久的 ■単価80万円以上の講師陣 ■AWSやJavaに強い |
|
■受講料完全無料 ■最短1か月で卒業 ■教室への通学も可能 |
JavaScriptをHTMLに埋め込む2つの基本パターン
HTMLファイルでJavaScriptを動作させるには、主に「HTMLファイル内に直接書き込む方法」と、「外部に専用ファイルを作成して読み込む方法」があります。
どちらも<script>
というHTMLタグを利用する点は共通しています。
それぞれの方法を具体的に見ていきましょう。
scriptをHTMLに直接埋め込む
一つ目は、HTMLファイル内の<script>
タグの開始タグと終了タグの間に、直接JavaScriptのコードを記述する方法です。
この方法を「インライン」や「埋め込み」形式と呼びます。
サンプルコード
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>JavaScriptの埋め込みサンプル</title>
</head>
<body>
<h1>ボタンをクリックしてください</h1>
<button id="alertButton">クリック!</button>
<script>
// idが"alertButton"の要素を取得
const button = document.getElementById('alertButton');
// ボタンがクリックされた時の処理を定義
button.addEventListener('click', function() {
alert('ボタンがクリックされました!');
});
</script>
</body>
</html>
実行結果
上記のHTMLファイルをブラウザで開くと、「ボタンをクリックしてください」という見出しと「クリック!」というボタンが表示されます。
そのボタンをクリックすると、「ボタンがクリックされました!」というメッセージのダイアログが画面に現れます。
ソースコードの解説
このサンプルでは、<body>
タグの終わりに<script>
タグを設置しています。
const button = document.getElementById('alertButton');
この行は、HTML内にあるid="alertButton"
という属性を持つ要素(この場合は<button>
タグ)を探し出し、button
という名前の定数に格納する処理です。button.addEventListener('click', function() { ... });
これは、先ほど取得したボタン(button
)に対して、「もしクリックされたら、function() { ... }
の中の処理を実行せよ」という命令を追加しています。addEventListener
はイベント(ここではクリック)を監視するための機能です。alert('ボタンがクリックされました!');
addEventListener
によって指定された処理の中身です。alert()
は、引数に指定した文字列をブラウザの警告ダイアログとして表示する命令。これにより、ボタンがクリックされたことをユーザーが視覚的に認識できます。
このように、HTMLファイル内に直接スクリプトを記述することで、手軽に動作を試すことが可能です。
外部ファイルとしてJavaScriptを読み込む
二つ目は、JavaScriptのコードを.js
という拡張子を持つ別のファイルとして保存し、HTMLからそのファイルを読み込む方法です。
こちらが現在、Web開発における主流な方法といえるでしょう。
サンプルコード
まず、JavaScriptのコードだけを記述したファイルを作成します。
ファイル名は任意ですが、ここではscript.js
とします。
【script.js】
// idが"alertButton"の要素を取得
const button = document.getElementById('alertButton');
// ボタンがクリックされた時の処理を定義
button.addEventListener('click', function() {
alert('外部ファイルからJavaScriptが実行されました!');
});
次に、このscript.js
を読み込むためのHTMLファイルを作成します。
【index.html】
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>JavaScriptの外部読み込みサンプル</title>
</head>
<body>
<h1>ボタンをクリックしてください</h1>
<button id="alertButton">クリック!</button>
<script src="script.js"></script>
</body>
</html>
実行結果
index.html
をブラウザで開くと、先ほどの直接埋め込んだ場合と全く同じようにボタンが表示されます。
そしてボタンをクリックすると、「外部ファイルからJavaScriptが実行されました!」というメッセージのダイアログが現れます。
ソースコードの解説
JavaScriptのコード(script.js
)の内容は、先ほどのインライン形式で書いたものとほぼ同じです。
重要なのはHTML側の<script>
タグです。
<script src="script.js"></script>
<script>
タグにsrc
属性(ソースの略)を追加し、その値に読み込みたいJavaScriptファイルへのパスを指定します。今回はHTMLファイルと同じ階層にscript.js
を置いているため、ファイル名だけの指定で問題ありません。
src
属性を使うと、ブラウザは指定されたファイルをダウンロードし、その中身を解釈して実行します。
これにより、HTMLとJavaScriptのコードを完全に分離することが実現できるのです。
HTMLに直接埋め込むメリット・デメリット
手軽な直接埋め込みですが、いくつかの利点と欠点があります。
メリット
最大のメリットは、HTMLファイル一つで完結する手軽さでしょう。
外部ファイルを別途作成する必要がなく、HTTPリクエスト(サーバーへのファイル要求)の回数も増えません。
ごく短いコードを試したり、そのページだけでしか使わない特殊な処理を記述したりする場合には便利です。
デメリット
一方で、デメリットも存在します。
JavaScriptのコードが長くなると、HTMLファイル全体の記述量が増え、どこに何が書かれているのか見通しが悪くなります。
これは、コードの管理を難しくする要因です。
また、他のHTMLページで同じJavaScriptを使いたくなった場合、その都度コードをコピー&ペーストする必要があり、修正があった際にはすべてのページのコードを書き直さなければなりません。
これは非効率的で、ミスの原因にもなります。
外部ファイルとしてJavaScriptを読み込むメリット・デメリット
現在主流となっている「外部ファイル読み込み」の利点と欠点を見ていきましょう。
メリット
最大のメリットは、HTML(構造)とJavaScript(振る舞い)を分離できる点にあります。
これにより、コードの役割分担が明確になり、管理や修正が非常に容易になります。
また、一つのJavaScriptファイルを複数のHTMLページから読み込むこともできるため、コードの再利用性が格段に向上します。
さらに、一度読み込まれた外部JavaScriptファイルはブラウザにキャッシュ(一時保存)されるため、ユーザーがサイト内の別ページに移動した際に、再度同じファイルをダウンロードする必要がありません。
結果として、ページの表示速度の向上に繋がるのです。
デメリット
デメリットは、管理するファイルがHTMLとJavaScriptの2つ以上に分かれる点です。
しかし、これはコードの管理しやすさというメリットの裏返しでもあり、現代の開発ではほとんど問題になりません。
また、ファイルを読み込むためのHTTPリクエストが発生しますが、これも後述するasync
/defer
属性や、現在の通信技術(HTTP/2など)によって影響は最小限に抑えられます。
読み込みを効率化する2つの属性(async・defer)
外部ファイルとしてJavaScriptを読み込む際、ページの表示パフォーマンスを向上させるための重要な属性がasync
とdefer
です。
これらは<script>
タグに追加して使用します。
ブラウザはHTMLを上から順に読み込み(解析し)、画面に表示していきます。
その途中で<script src="..."></script>
を見つけると、通常はHTMLの解析を一旦中断し、JavaScriptファイルのダウンロードと実行を優先します。
もしJavaScriptファイルが大きければ、その間ユーザーは真っ白な画面を見ることになりかねません。
async
とdefer
は、この問題を解決するために生まれました。
非同期で実行する「async属性」
async
属性は「asynchronous(非同期)」の略です。
この属性を付けた<script>
タグは、HTMLの解析を止めずに、解析と並行してJavaScriptファイルのダウンロードを進めます。
そして、ダウンロードが完了した時点でHTMLの解析を中断し、スクリプトを実行します。
<script src="analytics.js" async></script>
ダウンロードが完了次第すぐに実行されるため、複数のasync
スクリプトがある場合、実行される順番は保証されません。
そのため、他のスクリプトに依存しない、独立した機能(例えばGoogle Analyticsのようなアクセス解析タグなど)の読み込みに適しています。
HTMLの解析後に実行する「defer属性」
defer
属性は「延期する」という意味を持ちます。
この属性を付けた<script>
タグも、async
と同様にHTMLの解析と並行してダウンロードが行われます。
しかし、async
と決定的に違うのは、ダウンロードが完了してもすぐには実行されない点です。
スクリプトの実行は、HTML全体の解析がすべて完了した直後(DOMContentLoaded
イベントの前)まで延期されます。
<script src="main.js" defer></script>
複数のdefer
スクリプトがある場合、HTMLに記述された順序通りに実行されることが保証されます。
HTMLの要素(DOM)を操作するような一般的なJavaScriptは、HTMLの解析が終わってから実行されるべきなので、このdefer
属性の利用が、現在最も安全で推奨される方法となっています。
まとめ
今回は、HTMLでJavaScriptを利用するための基本的な方法について解説しました。
なお、HTMLを始めとする言語を体系的に学び、効率よくスキルを高めるには、プログラミングスクールを利用するのも有効です。
細かな疑問がすぐに解決するだけでなく、現役エンジニアが「質の高いポートフォリオ」を作成するための手助けをしてくれたり、エンジニア就職・転職のコツを教えてくれたりするなど、様々なメリットがありますので、独学に疲れた方は検討してみてはいかがでしょうか。