基礎から学ぶJavaScript入門 90日コース | Webページを操作するDOM - Day 32:要素の取得

JavaScript 90日で身につけるJavaScript
スポンサーリンク
スポンサーリンク
  1. Day 32:要素の取得(前半)
  2. 要素取得の基本:まず「document」からスタートする
    1. なぜ「document」なのか
  3. getElementById():一番シンプルでよく使う入口
    1. 役割と特徴
    2. HTMLとセットで見る例
    3. 重要ポイント
  4. querySelector():CSSセレクタで「1つだけ」要素を取得
    1. 役割と特徴
    2. HTMLとセットで見る例
    3. 重要ポイント
  5. querySelectorAll():CSSセレクタで「複数の要素」をまとめて取得
    1. 役割と特徴
    2. HTMLとセットで見る例
    3. 重要ポイント
  6. 3つのメソッドの使い分けイメージ
    1. ざっくりした使い分け
    2. セキュリティ・安全性の観点での注意
  7. 実践:HTML要素を取得して操作するミニアプリ
  8. Day 32 前半のまとめ
  9. Day 32:要素の取得(後半)
  10. 要素取得+操作の基本パターンをもう一度整理する
    1. ステップ1:HTML側に“目印”を付ける
    2. ステップ2:JavaScriptで要素を取得する
    3. ステップ3:イベントを使って“タイミング”を決める
    4. ステップ4:取得した要素のプロパティを変更する
  11. 実践①:入力フォームから値を取得して表示する
    1. 画面イメージ
    2. HTML+JavaScriptの例
    3. 重要ポイントの解説
  12. 実践②:リストの見た目を一括で変更する
    1. 画面イメージ
    2. HTML+JavaScriptの例
    3. 重要ポイントの解説
  13. 実践③:querySelectorで“特定の場所の要素”だけを操作する
    1. 画面イメージ
    2. HTML+JavaScriptの例
    3. 重要ポイントの解説
  14. セキュリティ・安全性の観点からの補足
    1. textContent を基本にする理由
  15. Day 32 後半 練習用総合テンプレート
  16. Day 32 後半のまとめ

Day 32:要素の取得(前半)

「JavaScriptで“どのHTMLを触るか”を正確に指定する」

Day 32では、DOM操作の中でも超重要なテーマである 「要素の取得」 を扱います。 WebページをJavaScriptで動かすとき、最初に必ずやることは、

「どのHTML要素を操作するのか」を特定すること

です。

そのために使うのが、

  • getElementById()
  • querySelector()
  • querySelectorAll()

という3つのメソッドです。

ここでは、それぞれの特徴と使い分けを、 初心者向けにかみ砕いて、実際のHTMLとセットで説明していきます。

要素取得の基本:まず「document」からスタートする

なぜ「document」なのか

JavaScriptがDOMにアクセスするときの入口は、常に document です。

console.log(document);
JavaScript
  • document は「今表示しているページ全体」を表すオブジェクトです。
  • その中にあるHTML要素を探すためのメソッドとして、 getElementById()querySelector() などが用意されています。

要素取得は、 「documentからスタートして、条件に合う要素を探す」 という流れだとイメージすると理解しやすいです。

getElementById():一番シンプルでよく使う入口

役割と特徴

getElementById() は、

「id属性が一致する要素を1つだけ取得する」

ためのメソッドです。

const element = document.getElementById('myId');
JavaScript
  • 引数:文字列(HTMLの id 属性の値)
  • 戻り値:該当する要素があればそのDOM要素、なければ null

HTMLとセットで見る例

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>getElementByIdの基本</title>
</head>
<body>
  <h1 id="mainTitle">こんにちは、getElementById</h1>
  <p id="description">このテキストはJavaScriptから変更できます。</p>

  <script>
    // id="mainTitle" の要素を取得します
    const titleElement = document.getElementById('mainTitle');

    // id="description" の要素を取得します
    const descriptionElement = document.getElementById('description');

    // 取得した要素のテキストをコンソールに表示します
    console.log('タイトル:', titleElement.textContent);
    console.log('説明文:', descriptionElement.textContent);

    // テキストを書き換えてみます
    titleElement.textContent = 'getElementByIdでタイトルを書き換えました';
    descriptionElement.textContent = '説明文もgetElementByIdで変更しました。';
  </script>
</body>
</html>

重要ポイント

  • id はページ内で 一意(ユニーク) にするのが基本です。
  • 「この要素は絶対に1つだけ」というもの(メインタイトル、メインコンテンツなど)に向いています。
  • シンプルで分かりやすいので、初心者にとって最初のDOM取得メソッドとして最適です。

querySelector():CSSセレクタで「1つだけ」要素を取得

役割と特徴

querySelector() は、

「CSSセレクタで指定した条件に合う要素のうち、最初の1つだけを取得する」

ためのメソッドです。

const element = document.querySelector('p');          // 最初の<p>要素
const element2 = document.querySelector('.item');     // class="item" の最初の要素
const element3 = document.querySelector('#mainTitle'); // id="mainTitle" の要素
JavaScript
  • 引数:CSSセレクタ(文字列)
  • 戻り値:条件に合う最初の要素、なければ null

HTMLとセットで見る例

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>querySelectorの基本</title>
</head>
<body>
  <h1 id="mainTitle">querySelectorの練習</h1>
  <p class="message">1つ目のメッセージです。</p>
  <p class="message">2つ目のメッセージです。</p>

  <script>
    // CSSセレクタで要素を取得します

    // idセレクタ(#mainTitle)
    const titleElement = document.querySelector('#mainTitle');

    // クラスセレクタ(.message) → 最初の1つだけ取得
    const firstMessageElement = document.querySelector('.message');

    // タグセレクタ(p) → 最初の<p>要素だけ取得
    const firstParagraphElement = document.querySelector('p');

    console.log('タイトル:', titleElement.textContent);
    console.log('最初の.message:', firstMessageElement.textContent);
    console.log('最初の<p>:', firstParagraphElement.textContent);

    // 最初の.messageのテキストを書き換えます
    firstMessageElement.textContent = 'querySelectorで最初の.messageを書き換えました';
  </script>
</body>
</html>

重要ポイント

  • querySelector()CSSセレクタをそのまま使える のが強みです。
  • #id名.クラス名タグ名div > pul li.item など、柔軟な指定ができます。
  • ただし「最初の1つだけ」なので、複数の要素をまとめて扱いたいときは querySelectorAll() を使います。

querySelectorAll():CSSセレクタで「複数の要素」をまとめて取得

役割と特徴

querySelectorAll() は、

「CSSセレクタで指定した条件に合う要素を“全部”取得する」

ためのメソッドです。

const elements = document.querySelectorAll('.item');
JavaScript
  • 引数:CSSセレクタ(文字列)
  • 戻り値:条件に合う要素の NodeList(配列に似たオブジェクト)

HTMLとセットで見る例

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>querySelectorAllの基本</title>
</head>
<body>
  <ul>
    <li class="item">商品A</li>
    <li class="item">商品B</li>
    <li class="item">商品C</li>
  </ul>

  <script>
    // .itemクラスを持つ要素をすべて取得します
    const itemElements = document.querySelectorAll('.item');

    console.log('itemElementsの数:', itemElements.length);

    // 1つずつ取り出してテキストをコンソールに表示します
    itemElements.forEach(function (element, index) {
      console.log(`item ${index}:`, element.textContent);
    });

    // すべての.itemのテキストの前に「★」を付けてみます
    itemElements.forEach(function (element) {
      element.textContent = '★ ' + element.textContent;
    });
  </script>
</body>
</html>

重要ポイント

  • querySelectorAll() の戻り値は NodeList で、forEach() が使えます。
  • 「同じクラスを持つ要素をまとめて操作したい」ときに非常に便利です。
  • 例えば「すべてのメニュー項目」「すべてのカード」「すべてのエラー表示」などに一括でスタイルやテキストを適用できます。

3つのメソッドの使い分けイメージ

ざっくりした使い分け

  • getElementById()
    • 「このページに1つだけある“特別な要素”」を取るとき
    • 例:メインタイトル、メインコンテンツ、メインボタンなど
  • querySelector()
    • 「CSSセレクタで柔軟に指定したいけれど、1つだけ取れればよい」とき
    • 例:最初の .error、特定の div 内の p など
  • querySelectorAll()
    • 「同じ条件に合う要素を全部まとめて操作したい」とき
    • 例:すべての .item、すべての .active、すべての .error など

セキュリティ・安全性の観点での注意

  • 取得した要素に対して innerHTML を不用意に書き換えると、 ユーザー入力をそのままHTMLとして解釈してしまい、 XSS(クロスサイトスクリプティング)の原因になることがあります。
  • 初心者の段階では、テキストの変更には textContent を使う ことを基本にすると安全です。

実践:HTML要素を取得して操作するミニアプリ

Day 32前半の内容をまとめて体験できるテンプレートを用意します。 3つのメソッドを使って、画面上のテキストを変更してみます。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Day 32 前半:要素の取得 練習テンプレート</title>
</head>
<body>
  <h1 id="pageTitle">要素の取得練習ページ</h1>

  <p class="message">1つ目のメッセージです。</p>
  <p class="message">2つ目のメッセージです。</p>
  <p class="message">3つ目のメッセージです。</p>

  <button id="changeTitleButton">タイトルを変更</button>
  <button id="changeFirstMessageButton">最初のメッセージを変更</button>
  <button id="changeAllMessagesButton">すべてのメッセージを変更</button>

  <script>
    // getElementByIdでタイトル要素を取得します
    const pageTitleElement = document.getElementById('pageTitle');

    // querySelectorで最初の.message要素を取得します
    const firstMessageElement = document.querySelector('.message');

    // querySelectorAllですべての.message要素を取得します
    const messageElements = document.querySelectorAll('.message');

    // ボタン要素を取得します
    const changeTitleButton = document.getElementById('changeTitleButton');
    const changeFirstMessageButton = document.getElementById('changeFirstMessageButton');
    const changeAllMessagesButton = document.getElementById('changeAllMessagesButton');

    // タイトルを変更するボタンのイベント
    changeTitleButton.addEventListener('click', function () {
      pageTitleElement.textContent = 'getElementByIdでタイトルを変更しました';
      console.log('タイトルを変更しました。');
    });

    // 最初のメッセージを変更するボタンのイベント
    changeFirstMessageButton.addEventListener('click', function () {
      firstMessageElement.textContent = 'querySelectorで取得した最初のメッセージを変更しました';
      console.log('最初の.messageを変更しました。');
    });

    // すべてのメッセージを変更するボタンのイベント
    changeAllMessagesButton.addEventListener('click', function () {
      messageElements.forEach(function (element, index) {
        element.textContent = `querySelectorAllで取得したメッセージ ${index + 1} を変更しました`;
      });
      console.log('すべての.messageを変更しました。');
    });
  </script>
</body>
</html>

このテンプレートで、

  1. それぞれのボタンをクリックして、画面の変化を確認する
  2. 開発者ツールのコンソールでログを確認する
  3. getElementById / querySelector / querySelectorAll が どの要素を対象にしているかを意識する

ことで、「要素取得 → 操作」というDOMの基本パターンが体に馴染んでいきます。

Day 32 前半のまとめ

Day 32前半では、

  • 要素取得は「documentからスタートして、条件に合う要素を探す」流れであること
  • getElementById() は「idで1つだけ」を取る、シンプルでよく使うメソッドであること
  • querySelector() はCSSセレクタで「最初の1つ」を柔軟に指定できること
  • querySelectorAll() はCSSセレクタで「複数の要素」をまとめて取得し、 forEach() などで一括操作できること
  • テキストの変更には textContent を使うことで、安全にDOMを操作できること

を確認しました。

この3つのメソッドは、 今後のDOM操作のほぼすべての場面で登場する「基本の道具」です。


Day 32:要素の取得(後半)

「“現実的なミニ画面”を題材にして、要素取得と操作をまとめて練習する」

Day 32後半では、前半で学んだ

  • getElementById()
  • querySelector()
  • querySelectorAll()

を、少し現実的なミニUI(画面) に当てはめて練習していきます。 単に「テキストを変える」だけでなく、

  • 入力フォームから値を取る
  • リストの見た目を変える
  • ボタン操作で表示内容を切り替える

といった、Webページらしい動きを通して、 「要素を取得して操作する」流れを体に馴染ませていきます。

要素取得+操作の基本パターンをもう一度整理する

ステップ1:HTML側に“目印”を付ける

JavaScriptから要素を取得するためには、 HTML側に「どの要素か分かる目印」を付けておく必要があります。

  • id 属性
  • class 属性
  • タグ名や構造(div > p など)

例:

<h1 id="pageTitle">タイトル</h1>
<p class="message">メッセージ1</p>
<p class="message">メッセージ2</p>
<button id="changeButton">変更</button>

ステップ2:JavaScriptで要素を取得する

const titleElement = document.getElementById('pageTitle'); // idで取得
const firstMessageElement = document.querySelector('.message'); // 最初の.message
const allMessageElements = document.querySelectorAll('.message'); // すべての.message
const changeButtonElement = document.getElementById('changeButton'); // ボタン
JavaScript

ステップ3:イベントを使って“タイミング”を決める

changeButtonElement.addEventListener('click', function () {
  // ここに「クリックされたときのDOM操作」を書きます
});
JavaScript

ステップ4:取得した要素のプロパティを変更する

titleElement.textContent = '新しいタイトル';
firstMessageElement.textContent = '最初のメッセージを書き換えました';

allMessageElements.forEach(function (element, index) {
  element.textContent = `メッセージ${index + 1}を一括変更しました`;
});
JavaScript

この流れが、

「HTML要素を取得して操作する」

ときの基本パターンです。

実践①:入力フォームから値を取得して表示する

画面イメージ

  • テキスト入力欄
  • 「表示」ボタン
  • 入力された内容を表示する <p>

という、よくあるミニUIを作ります。

HTML+JavaScriptの例

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>入力フォームから値を取得して表示する</title>
</head>
<body>
  <h1>入力内容を表示するミニアプリ</h1>

  <!-- 入力フォーム -->
  <input id="nameInput" type="text" placeholder="名前を入力してください">
  <button id="showButton">表示</button>

  <!-- 結果表示 -->
  <p id="resultMessage">ここに結果が表示されます。</p>

  <script>
    // 要素を取得します
    const nameInputElement = document.getElementById('nameInput');      // 入力欄
    const showButtonElement = document.getElementById('showButton');    // ボタン
    const resultMessageElement = document.getElementById('resultMessage'); // 結果表示

    // ボタンがクリックされたときの処理を登録します
    showButtonElement.addEventListener('click', function () {
      // 入力欄の値を取得します
      const name = nameInputElement.value; // input要素のvalueプロパティに入力値が入っています

      // 入力が空かどうかをチェックします
      if (name.trim() === '') {
        resultMessageElement.textContent = '名前が入力されていません。入力してください。';
        return;
      }

      // 結果メッセージを表示します
      resultMessageElement.textContent = `こんにちは、${name}さん!`;
    });
  </script>
</body>
</html>

重要ポイントの解説

  • getElementById() で、入力欄・ボタン・結果表示の3つを取得しています。
  • 入力欄の値は value プロパティから取得します。
  • textContent を使って結果表示を安全に書き換えています。

ここでのポイントは、

「HTML側にidを付けておき、JavaScript側でそれを取得して、 ユーザーの操作に応じてDOMを更新する」

という一連の流れを体験することです。

実践②:リストの見た目を一括で変更する

画面イメージ

  • 商品リスト(<li> が複数)
  • 「強調表示」ボタン
  • すべての商品に「★」を付ける

というミニUIを作ります。

HTML+JavaScriptの例

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>リストの見た目を一括変更する</title>
</head>
<body>
  <h1>商品リスト</h1>

  <ul>
    <li class="productItem">ノート</li>
    <li class="productItem">ボールペン</li>
    <li class="productItem">消しゴム</li>
  </ul>

  <button id="highlightButton">すべての商品を強調表示</button>

  <script>
    // すべての.productItem要素を取得します
    const productItemElements = document.querySelectorAll('.productItem');

    // ボタン要素を取得します
    const highlightButtonElement = document.getElementById('highlightButton');

    // ボタンがクリックされたときの処理
    highlightButtonElement.addEventListener('click', function () {
      // すべての.productItemに対して処理を行います
      productItemElements.forEach(function (element) {
        // テキストの前に「★」を付けます
        element.textContent = '★ ' + element.textContent;

        // スタイルを変更して強調表示します(例として色を変える)
        element.style.color = 'red';
        element.style.fontWeight = 'bold';
      });

      console.log('すべての商品を強調表示しました。');
    });
  </script>
</body>
</html>

重要ポイントの解説

  • querySelectorAll('.productItem') で、複数の要素をまとめて取得しています。
  • forEach() を使って、すべての要素に同じ処理を適用しています。
  • textContentstyle を組み合わせて、見た目を変えています。

ここでのポイントは、

「同じクラスを持つ複数の要素を、まとめて操作する」

という querySelectorAll() の強みを体感することです。

実践③:querySelectorで“特定の場所の要素”だけを操作する

画面イメージ

  • お知らせエリア
  • メインコンテンツエリア
  • 「お知らせだけ書き換える」ボタン

という構成を作り、 querySelector() で「特定の場所の要素」を指定して操作します。

HTML+JavaScriptの例

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>特定の場所の要素だけを操作する</title>
</head>
<body>
  <div id="noticeArea">
    <h2>お知らせ</h2>
    <p class="message">本日は通常営業です。</p>
  </div>

  <div id="mainContent">
    <h2>メインコンテンツ</h2>
    <p class="message">ここはメインコンテンツの説明です。</p>
  </div>

  <button id="changeNoticeButton">お知らせだけ書き換える</button>

  <script>
    // お知らせエリアのdiv要素を取得します
    const noticeAreaElement = document.getElementById('noticeArea');

    // メインコンテンツエリアのdiv要素を取得します
    const mainContentElement = document.getElementById('mainContent');

    // ボタン要素を取得します
    const changeNoticeButtonElement = document.getElementById('changeNoticeButton');

    // ボタンがクリックされたときの処理
    changeNoticeButtonElement.addEventListener('click', function () {
      // お知らせエリアの中にある.message要素だけを取得します
      const noticeMessageElement = noticeAreaElement.querySelector('.message');

      // メインコンテンツ側の.messageは取得しません(今回は操作対象外)

      // お知らせのメッセージを書き換えます
      noticeMessageElement.textContent = '本日は臨時休業です。ご注意ください。';

      console.log('お知らせエリアだけを書き換えました。');
    });
  </script>
</body>
</html>

重要ポイントの解説

  • document.querySelector() だけでなく、 任意の要素(ここでは noticeAreaElement)に対して querySelector() を呼び出せる ことが重要です。
  • これにより、「ページ全体」ではなく「特定のエリアの中だけ」を対象にした検索ができます。

ここでのポイントは、

「どこから検索するか」を意識することで、 より細かくDOMを操作できるようになる

ということです。

セキュリティ・安全性の観点からの補足

textContent を基本にする理由

初心者の段階では、 テキストの変更には textContent を使うことを基本にすると安全です。

element.textContent = userInput; // ユーザー入力をそのままテキストとして扱う
JavaScript
  • textContent は、文字列を「そのままテキスト」として扱い、 HTMLとして解釈しません。
  • これにより、ユーザー入力に <script> などが含まれていても、 それが実行されることはありません。

一方で innerHTML を使うと、

element.innerHTML = userInput; // ユーザー入力をHTMLとして解釈してしまう
JavaScript
  • ユーザー入力がそのままHTMLとして扱われ、 悪意のあるスクリプトが実行される可能性があります。

そのため、 「まずはtextContentを使う」 という習慣を身につけておくことは、 セキュリティの観点からも非常に重要です。

Day 32 後半 練習用総合テンプレート

最後に、Day 32後半の内容を1つにまとめた練習用テンプレートを紹介します。 この中に自分でコードを追加・変更しながら、 要素取得と操作の感覚を育てていくことができます。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Day 32 後半:要素の取得と操作 総合練習テンプレート</title>
</head>
<body>
  <h1 id="pageTitle">要素取得と操作の総合練習</h1>

  <!-- 入力フォーム -->
  <div>
    <input id="nameInput" type="text" placeholder="名前を入力してください">
    <button id="showButton">名前を表示</button>
    <p id="resultMessage">ここに結果が表示されます。</p>
  </div>

  <!-- 商品リスト -->
  <div>
    <h2>商品リスト</h2>
    <ul>
      <li class="productItem">ノート</li>
      <li class="productItem">ボールペン</li>
      <li class="productItem">消しゴム</li>
    </ul>
    <button id="highlightButton">商品を強調表示</button>
  </div>

  <!-- お知らせとメインコンテンツ -->
  <div id="noticeArea">
    <h2>お知らせ</h2>
    <p class="message">本日は通常営業です。</p>
  </div>

  <div id="mainContent">
    <h2>メインコンテンツ</h2>
    <p class="message">ここはメインコンテンツの説明です。</p>
  </div>

  <button id="changeNoticeButton">お知らせだけ書き換える</button>

  <script>
    console.log('--- 要素取得と操作 総合練習開始 ---');

    // タイトル要素
    const pageTitleElement = document.getElementById('pageTitle');

    // 入力フォーム関連
    const nameInputElement = document.getElementById('nameInput');
    const showButtonElement = document.getElementById('showButton');
    const resultMessageElement = document.getElementById('resultMessage');

    // 商品リスト関連
    const productItemElements = document.querySelectorAll('.productItem');
    const highlightButtonElement = document.getElementById('highlightButton');

    // お知らせ・メインコンテンツ関連
    const noticeAreaElement = document.getElementById('noticeArea');
    const mainContentElement = document.getElementById('mainContent');
    const changeNoticeButtonElement = document.getElementById('changeNoticeButton');

    // タイトルをコンソールに表示
    console.log('現在のタイトル:', pageTitleElement.textContent);

    // 名前表示ボタンのイベント
    showButtonElement.addEventListener('click', function () {
      const name = nameInputElement.value;

      if (name.trim() === '') {
        resultMessageElement.textContent = '名前が入力されていません。入力してください。';
        return;
      }

      resultMessageElement.textContent = `こんにちは、${name}さん!`;
      console.log('名前を表示しました:', name);
    });

    // 商品強調ボタンのイベント
    highlightButtonElement.addEventListener('click', function () {
      productItemElements.forEach(function (element) {
        element.textContent = '★ ' + element.textContent;
        element.style.color = 'blue';
        element.style.fontWeight = 'bold';
      });
      console.log('商品を強調表示しました。');
    });

    // お知らせだけ書き換えるボタンのイベント
    changeNoticeButtonElement.addEventListener('click', function () {
      const noticeMessageElement = noticeAreaElement.querySelector('.message');
      noticeMessageElement.textContent = '本日は臨時休業です。ご注意ください。';
      console.log('お知らせエリアだけを書き換えました。');
    });

    console.log('--- 要素取得と操作 総合練習テンプレートの準備が完了しました ---');
  </script>
</body>
</html>

Day 32 後半のまとめ

Day 32後半では、

  • getElementById()querySelector()querySelectorAll() を、 実際のミニUIに当てはめて使う練習を行ったこと
  • 入力フォーム・リスト・特定エリアなど、 Webページらしい構造を題材にして、 「要素取得 → イベント → DOM操作」の流れを確認したこと
  • セキュリティの観点から、 テキストの変更には textContent を基本にする重要性を押さえたこと

を整理しました。

この「要素を正しく取得して、安全に操作する」感覚は、 今後のDOM操作・UI開発のすべての土台になります。

タイトルとURLをコピーしました