この記事では、HTMLの要素を操作したり、クリックなどのイベントに反応させたりするための基本的な書き方を紹介します。
実務でも頻繁に登場する「DOMの取得」と「イベントリスナー」の使い方を詳しく解説していきます。
前提知識:
DOM(ドム)とは、Document Object Model の略です。
HTMLを「JavaScriptから操作できるようにした構造体」で、ページ内の要素をツリー状に表しています。
つまり、「HTMLの内容を JavaScript から自由に読み取ったり、書き換えたりするための仕組み」です。
解説:
JavaScriptでHTMLを操作するためには、まず「対象の要素を取得する」ことが必要です。
その中でもよく使われるのが document.querySelector() です。
「HTMLとJavaScriptをつなぐ第一歩」として、使い方をしっかり覚えましょう。
HTMLに以下のようなボタンがあったとします:
<button id="myBtn">クリックしてね</button>JavaScriptでこのボタンを取得するには、次のように書きます。
// ボタン要素を取得
const btn = document.querySelector('#myBtn');
// 結果 : ボタン要素が取得される(HTMLButtonElement)
console.log(btn);
querySelector() は「最初に見つかった1つ」を返します。
同じクラスの要素をすべて取りたい場合は querySelectorAll() を使います。
// すべての.box要素を取得(NodeListが返る)
const boxes = document.querySelectorAll('.box');
指定した要素が存在しないときは、null が返ります。
また、HTMLの読み込み前にJavaScriptを実行すると、同じく null になります。
// HTML読み込み後に実行するようにする
document.addEventListener('DOMContentLoaded', () => {
const btn = document.querySelector('#myBtn');
console.log(btn); // 👉 nullにならない
});
解説:
HTML要素を取得できるようになったら、次はその要素に「動きをつける」方法を学びましょう。
JavaScriptでは、ユーザーの操作(クリック・入力など)に反応させるために、addEventListener を使います。
たとえば、ボタンをクリックすると、下のテキストが変化するような動きをつけることができます。
<button id="myBtn">クリックしてね</button>
<p id="result">ここが変わります</p>JavaScript側のコードは次のようになります:
// 要素を取得
const btn = document.querySelector('#myBtn');
const result = document.querySelector('#result');
// イベントリスナーを追加
btn.addEventListener('click', () => {
result.textContent = 'クリックされました!';
});
addEventListener は第1引数に「イベントの種類」、第2引数に「反応させる処理(関数)」を指定します。
よく使われるイベントを以下にまとめます:
次は、クリックに反応して背景色が変わる例です。実際に試してみましょう。⇒
<button id="bgBtn">背景色を変える</button>
const bgBtn = document.querySelector('#bgBtn');
bgBtn.addEventListener('click', () => {
document.body.style.backgroundColor = '#f0f8ff';
});このように、addEventListener を使えばユーザー操作に柔軟に反応させることができます。
const target = document.querySelector('#event_listener'); // 背景を変える対象をDOM操作で取得
const bgBtn = document.querySelector('#bgColor'); // 背景色変更ボタンをDOM操作で取得
const color = ['#f0f8ff', '#e6f7ff', '#f9f5d7', '#e8f5e9', '#fff3e0']; // 淡い色をいくつか設定
bgBtn.addEventListener('click', () =>{ // ボタンがクリックされたときのイベントを設定
const i = Math.floor(Math.random() * color.length); // 色をランダムに選択(インデックスを生成)
target.style.backgroundColor = color[i]; // 対象の背景色を変更
});
※color.lengthを使うことで、色の数が変わってもランダム選択が自動対応できます。
今回だと5色設定されているので、「color.length === 5」となります。
解説:
Webページでは、ユーザーに名前やコメントなどを入力してもらう場面がよくあります。
そのときに必要になるのが「バリデーション(入力チェック)」です。
今回は、未入力チェックや文字数制限など、基本的なフォームバリデーションの方法を紹介します。
ここでは、名前を入力する簡単なフォームを使って、バリデーションの流れを見ていきます。
<form id="myForm">
<label for="name">名前:</label>
<input type="text" id="name">
<button type="submit">送信</button>
<p id="errorMsg"></p>
</form>JavaScript側では、次のように「未入力」や「文字数不足」をチェックします。
const form = document.querySelector('#myForm');
const nameInput = document.querySelector('#name');
const errorMsg = document.querySelector('#errorMsg');
form.addEventListener('submit', (e) => {
e.preventDefault(); // フォームの送信を止める
const name = nameInput.value.trim(); // 空白を除いた入力値を取得
if (name === '') {
errorMsg.textContent = '※名前を入力してください。';
return;
}
if (name.length < 3) {
errorMsg.textContent = '※3文字以上入力してください。';
return;
}
errorMsg.textContent = '送信完了!(実際には送信処理をここに書きます)';
});※背景色などの装飾はCSSで追加しています。上記のコードだけでは適用されません
-----------------
このように、JavaScriptだけで簡単な入力チェックを行うことができます。
より本格的なフォーム処理では、正規表現によるチェックやサーバーサイドとの連携も加わってきますが、まずはこのような基本から始めましょう。