JavaScriptをHTMLに直接記述するとは?
今回は、JavaScriptをHTMLに直接記述する方法について解説していきたいと思います。
JavaScriptは、Webページに動的な機能を追加するための強力なプログラミング言語です。
通常、JavaScriptのコードは外部ファイルに記述し、HTMLから読み込むことが一般的ですが、HTMLに直接JavaScriptのコードを記述することも可能なんです。
○JavaScriptとHTMLの関係性
JavaScriptとHTMLは、密接な関係にあります。
HTMLがWebページの構造を定義するのに対し、JavaScriptはWebページの動作を制御します。
HTMLの中でJavaScriptを使用することで、次のようなことができます。
・フォームの入力値のチェックや、動的なフォームの生成
・ボタンクリックなどのユーザーアクションに応じた処理の実行
・Ajaxを使ったサーバーとの非同期通信
・アニメーションやエフェクトの実装
このように、JavaScriptを活用することで、よりインタラクティブで動的なWebページを作成することができるのです。
○直接記述のメリットとデメリット
では、JavaScriptをHTMLに直接記述するメリットとデメリットについて見ていきましょう。
【メリット】
・外部ファイルを読み込む必要がないため、ページの読み込み速度が向上する
・コードとHTMLが1つのファイルにまとまるため、管理がシンプルになる
・小規模なスクリプトには適している
【デメリット】
・コードとHTMLが混在するため、コードの可読性が低下する
・同じスクリプトを複数のページで使い回しにくい
・大規模なスクリプトを記述すると、HTMLファイルが肥大化する
このように、直接記述にはメリットとデメリットがあります。適材適所で使い分けることが重要ですね。
○サンプルコード1:基本的な記述例
それでは実際に、JavaScriptをHTMLに直接記述する基本的な例を見てみましょう。
このコードを実行すると、次のような結果になります。
- ページが読み込まれると、コンソールに “Hello, World!” と出力される
- 「あいさつ」ボタンをクリックすると、”こんにちは、太郎さん!” というアラートが表示される
このように、<script>
タグの中にJavaScriptのコードを直接記述することで、HTMLにJavaScriptの機能を組み込むことができます。
●scriptタグを使った直接記述
さて、JavaScriptをHTMLに直接記述する方法の中で最もポピュラーなのが、<script>
タグを使う方法です。
○scriptタグの使い方
<script>
タグは、HTMLの中でJavaScriptのコードを埋め込むために使用します。
<script>
タグは、<head>
タグまたは<body>
タグの中に配置することができます。
<script>
タグには、次のような属性を指定することができます。
src
:外部のJavaScriptファイルのURLを指定するtype
:スクリプトのタイプを指定する(デフォルトは”text/javascript”)async
:非同期でスクリプトを実行するかどうかを指定するdefer
:スクリプトの実行をページの解析が完了するまで延期するかどうかを指定する
○サンプルコード2:scriptタグを使った例
それでは、<script>
タグを使ってJavaScriptのコードを直接記述する例を見てみましょう。
このコードを実行すると、次のような結果になります。
- ページが読み込まれると、コンソールに “ページが読み込まれました” と出力される
- “クリック”ボタンをクリックすると、”ボタンがクリックされました” というアラートが表示される
○async属性とdefer属性の違い
<script>
タグには、async
属性とdefer
属性という2つの属性があります。
この属性は、スクリプトの読み込みと実行のタイミングを制御するために使用されます。
async
属性:スクリプトを非同期で読み込み、読み込みが完了次第すぐに実行するdefer
属性:スクリプトを非同期で読み込むが、ページの解析が完了するまで実行を延期する
async
属性は、スクリプトの実行順序を保証しません。一方、defer
属性は、スクリプトの実行順序を保証します。
○サンプルコード3:async属性とdefer属性の使用例
それでは、async
属性とdefer
属性の使用例を見てみましょう。
このコードを実行すると、次のような結果になります。
- “インラインスクリプト” が出力される
- “script1.js” が出力される(タイミングは不定)
- “script2.js” が出力される(ページの解析後)
このように、async
属性とdefer
属性を使い分けることで、スクリプトの読み込みと実行のタイミングを制御することができます。
●イベントハンドラとしての直接記述
JavaScriptをHTMLに直接記述する方法として、もう1つ重要なのがイベントハンドラとしての記述方法です。
○イベントハンドラの概要
イベントハンドラとは、HTMLの要素で発生するイベント(クリック、フォーム送信、キー入力など)に対して、JavaScriptの関数を紐付ける仕組みのことを指します。
イベントハンドラを使うことで、ユーザーの操作に応じてJavaScriptの処理を実行することができます。
これにより、Webページにインタラクティブ性を持たせることができるのです。
それでは、具体的なイベントハンドラの使用例を見ていきましょう。
○サンプルコード4:クリックイベントハンドラの例
クリックイベントは、ユーザーがHTML要素をクリックしたときに発生するイベントです。
ここでは、ボタンのクリックイベントにJavaScriptの関数を紐付ける例を見てみましょう。
このコードを実行すると、「クリックしてね」というボタンが表示され、そのボタンをクリックすると、「ボタンがクリックされました!」というアラートが表示されます。
ここでポイントなのが、<button>
タグのonclick
属性に、handleClick()
という関数を指定している部分です。
これで、ボタンがクリックされたときにhandleClick()
関数が実行されるようになっています。
○サンプルコード5:フォーム送信イベントハンドラの例
フォーム送信イベントは、フォームが送信されたときに発生するイベントです。
ここでは、フォームの送信イベントにJavaScriptの関数を紐付ける例を紹介します。
このコードを実行すると、名前を入力するテキストフィールドと送信ボタンが表示されます。
名前を入力して送信ボタンを押すと、handleSubmit()
関数が実行され、アラートで「こんにちは、〇〇さん!」と表示されます。
ここでは、<form>
タグのonsubmit
属性にhandleSubmit(event)
関数を指定しています。
これにより、フォームが送信されたときにhandleSubmit()
関数が実行されます。
また、handleSubmit()
関数の中でevent.preventDefault()
を呼び出しています。
これは、フォームのデフォルトの送信動作をキャンセルするためのものです。
これで、JavaScriptの処理を実行した後に、ページが遷移しないようにしています。
○サンプルコード6:キー入力イベントハンドラの例
キー入力イベントは、ユーザーがキーボードを操作したときに発生するイベントです。
テキストフィールドのキー入力イベントにJavaScriptの関数を紐付ける例を紹介します。
このコードを実行すると、メッセージを入力するテキストフィールドが表示され、そのすぐ下にプレビューが表示されます。
テキストフィールドに入力すると、リアルタイムでプレビューが更新されます。
ここでは、<input>
タグのonkeyup
属性にhandleKeyUp()
関数を指定しています。
これで、テキストフィールドでキーが離されるたびにhandleKeyUp()
関数が実行されます。
handleKeyUp()
関数の中では、テキストフィールドの値を取得し、プレビュー用の<p>
タグに設定しています。
このような形で、リアルタイムでプレビューが更新される仕組みになっています。
○サンプルコード7:マウスオーバーイベントハンドラの例
マウスオーバーイベントは、ユーザーがマウスカーソルをHTML要素の上に重ねたときに発生するイベントです。
画像のマウスオーバーイベントにJavaScriptの関数を紐付ける例を見てみましょう。
このコードを実行すると、サムネイル画像が表示され、その画像にマウスカーソルを重ねると、フルサイズの画像がオーバーレイ表示されます。
マウスカーソルを外すと、フルサイズの画像が非表示になります。
ここでは、<img>
タグのonmouseover
属性にshowFullSize()
関数を、onmouseout
属性にhideFullSize()
関数を指定しています。
これで、マウスカーソルが画像の上に重なったときにshowFullSize()
関数が実行され、フルサイズの画像が表示されます。
マウスカーソルが画像から外れたときにはhideFullSize()
関数が実行され、フルサイズの画像が非表示になります。
●JavaScriptの直接記述でよくあるエラーと対処法
JavaScriptをHTMLに直接記述する際には、いくつかの注意点があります。
ここでは、よくあるエラーとその対処法について解説していきたいと思います。
○scriptタグの位置による実行タイミングのエラー
JavaScriptのコードを<script>
タグで直接記述する場合、<script>
タグの位置によって実行タイミングが異なることがあります。
例えば、次のようなコードを考えてみましょう。
このコードを実行すると、次のようなエラーが発生します。
エラーメッセージから、document.getElementById("message")
がnull
を返していることがわかります。
これは、<script>
タグが<head>
タグ内にあるため、DOMの読み込みが完了する前にJavaScriptのコードが実行されてしまうためです。
この問題を解決するには、次のように<script>
タグを<body>
タグの最後に移動します。
こうすることで、DOMの読み込みが完了した後にJavaScriptのコードが実行されるようになり、エラーが解消されます。
<script>
タグの位置に気をつけることは、JavaScriptのコードを直接記述する際の重要なポイントの1つです。
DOMの読み込みが完了してから操作したい要素にアクセスするようにしましょう。
○グローバル変数の競合によるエラー
JavaScriptのコードを直接記述する際には、グローバルスコープで変数や関数を定義することがあります。
しかし、複数のスクリプトでグローバル変数や関数を定義すると、競合が発生する可能性があります。
例えば、次のようなコードを考えてみましょう。
このコードでは、2つのスクリプトがそれぞれmessage
変数とshowMessage()
関数を定義しています。
しかし、2つ目のスクリプトで定義されたmessage
変数とshowMessage()
関数が、1つ目のスクリプトで定義されたものを上書きしてしまっています。
その結果、「メッセージを表示」ボタンをクリックすると、console.log(message)
が実行され、アラートが表示されない問題が発生します。
この問題を解決するには、次のように即時関数(IIFE)を使ってスクリプトをカプセル化します。
即時関数を使うことで、各スクリプトのスコープが分離され、グローバル変数や関数の競合を防ぐことができます。
グローバルスコープに公開する必要がある関数は、window
オブジェクトのプロパティとして明示的に公開します。
こうすることで、「メッセージを表示」ボタンをクリックすると、alert(message)
が実行され、アラートが表示されるようになります。
●JavaScriptの直接記述の応用例
さて、ここまでJavaScriptをHTMLに直接記述する基本的な方法について解説してきました。
それでは、直接記述を応用したサンプルコードを見ていきましょう。
JavaScriptの直接記述は、Webサイトにインタラクティブな機能を追加するために非常に便利です。
ここでは、よくある応用例をいくつか紹介したいと思います。
○サンプルコード8:動的なフォームのバリデーション
フォームのバリデーションは、ユーザーが入力した値が正しいかどうかを検証するために使用されます。
ここでは、JavaScriptを使って動的にフォームのバリデーションを行う例を見てみましょう。
このコードを実行すると、フォームが表示され、名前、メールアドレス、パスワードを入力するフィールドがあります。送信ボタンを押すと、validateForm()
関数が呼び出されます。
validateForm()
関数では、各フィールドの値を検証し、エラーメッセージを表示します。
名前が空の場合、メールアドレスが正しい形式でない場合、パスワードが6文字未満の場合にエラーメッセージが表示されます。
エラーがある場合はisValid
フラグをfalse
に設定し、フォームの送信を防ぎます。
エラーがない場合は、フォームが送信されます。
このように、JavaScriptを使ってフォームのバリデーションを動的に行うことで、ユーザーにリアルタイムでフィードバックを提供し、入力ミスを防ぐことができます。
○サンプルコード9:アコーディオンメニューの実装
アコーディオンメニューは、クリックすると内容が展開・折りたたみされるメニューです。
ここでは、JavaScriptを使ってアコーディオンメニューを実装する例を見てみましょう。
このコードを実行すると、3つのセクションを持つアコーディオンメニューが表示されます。
各セクションのボタンをクリックすると、対応する内容が展開・折りたたみされます。
JavaScriptでは、getElementsByClassName()
を使ってaccordion
クラスを持つ要素を取得し、クリックイベントのリスナーを追加しています。
クリックされたセクションのボタンにactive
クラスをトグルし、次の兄弟要素(内容を持つpanel
クラスの要素)の表示・非表示を切り替えています。
このように、JavaScriptを使ってアコーディオンメニューを実装することで、コンテンツを整理し、ユーザーが必要な情報にアクセスしやすくなります。
○サンプルコード10:タブ切り替えUIの実装
タブ切り替えUIは、複数のコンテンツを1つのページに表示し、タブをクリックすることで表示するコンテンツを切り替えるインターフェースです。
JavaScriptを使ってタブ切り替えUIを実装する例を紹介します。
このコードを実行すると、3つのタブを持つタブ切り替えUIが表示されます。
タブをクリックすると、対応するコンテンツが表示されます。
JavaScriptでは、openTab()
関数を定義し、クリックされたタブに応じて表示するコンテンツを切り替えています。
まず、getElementsByClassName()
を使ってtabcontent
クラスを持つ要素(コンテンツ)をすべて非表示にします。
次に、tablinks
クラスを持つ要素(タブ)からactive
クラスを削除し、クリックされたタブにactive
クラスを追加します。
最後に、getElementById()
を使ってクリックされたタブに対応するコンテンツを表示します。
○サンプルコード11:スライドショーの実装
スライドショーは、複数の画像を一定の間隔で切り替えて表示するUIです。
JavaScriptを使ってスライドショーを実装する例を見ながら考えていきましょう。
このコードを実行すると、スライドショーが表示され、矢印をクリックすることで画像が切り替わります。
JavaScriptでは、showSlides()
関数を定義し、現在表示されている画像のインデックスに基づいて表示する画像を切り替えています。
矢印をクリックすると、changeSlide()
関数が呼び出され、slideIndex
の値を増減させることで、表示する画像を切り替えます。
showSlides()
関数では、getElementsByClassName()
を使ってslide
クラスを持つ要素(画像)をすべて取得します。
現在のslideIndex
の値に基づいて、表示する画像を決定します。
slideIndex
が画像の枚数を超えた場合は最初の画像に戻り、slideIndex
が1未満の場合は最後の画像に移動します。
まとめ
JavaScriptをHTMLに直接記述する方法について、詳しく解説してきました。
この記事で学んだ知識を活かして、JavaScriptとHTMLを連携させ、より魅力的で使いやすいWebサイトを作成してください。
JavaScriptの直接記述は、Webエンジニアにとって欠かせないスキルです。
実践を積み重ねることで、より洗練されたコードを書けるようになるでしょう。