JavaScript 逆引き集 | querySelector(単一)

JavaScript JavaScript
スポンサーリンク

querySelector の基本 — document.querySelector('.cls')

querySelector は「CSSセレクタで、最初に一致した1つの要素」を取得するメソッドです。見つからなければ null を返します。クラス(.name)、ID(#id)、タグ(div)、入れ子(header h1)、属性セレクタ([data-x])など、CSSと同じ記法で柔軟に指定できます。


基本の使い方

<div id="app">
  <h1 class="title">Hello</h1>
  <p class="msg">Hi</p>
</div>
<script>
  const byClass = document.querySelector(".title"); // クラス
  const byId    = document.querySelector("#app");   // ID
  const byTag   = document.querySelector("p");      // タグ(最初の1件)

  console.log(byClass.textContent); // "Hello"
  console.log(byId.id);             // "app"
  console.log(byTag.className);     // "msg"
</script>
HTML
  • 特徴: CSSセレクタで指定し、最初の一致のみ取得。なければ null

セレクタのよくある書き方

document.querySelector("header h1");        // 入れ子(header内のh1)
document.querySelector(".card .title");     // 子孫の組み合わせ
document.querySelector("ul > li.item");     // 直接の子(>)
document.querySelector("[data-id='42']");   // 属性一致
document.querySelector("button.primary:hover"); // 疑似(注意: 実際の状態に依存)
JavaScript
  • ポイント: jQuery風の感覚でCSSの書き方そのままで指定できるのが強みです。

例題:ボタンでパネルを開閉

<button class="toggle">Open</button>
<div class="panel hidden">Content</div>

<style>
  .hidden { display: none; }
</style>

<script>
  const btn   = document.querySelector(".toggle");
  const panel = document.querySelector(".panel");

  btn.addEventListener("click", () => {
    panel.classList.toggle("hidden");
  });
</script>
HTML
  • 狙い: セレクタで単一要素を取り、イベント→クラス切り替えの基本パターン。

例題:フォームのバリデーションとメッセージ表示

<form id="login">
  <input name="email" type="email" placeholder="Email">
  <p class="error"></p>
  <button type="submit">Sign in</button>
</form>

<script>
  const form  = document.querySelector("#login");
  const error = document.querySelector("#login .error");

  form.addEventListener("submit", (e) => {
    e.preventDefault();
    const email = document.querySelector("#login [name='email']").value.trim();
    if (!email.includes("@")) {
      error.textContent = "メール形式が不正です";
      return;
    }
    error.textContent = "";
    // 送信処理へ...
  });
</script>
HTML
  • 狙い: 入れ子セレクタでフォーム内要素を絞り、単一取得で扱いやすくする。

実務でのコツ

  • 明確な範囲指定: document.querySelector だけでなく、親要素からの相対検索も使うと安全。
const card = document.querySelector(".card");
const titleInCard = card.querySelector(".title"); // カード内に限定
JavaScript
  • 存在チェック: const el = document.querySelector(".x"); if (!el) return; の癖をつける。見つからないと null で落ちます。
  • 単一 vs 複数: 複数欲しいなら querySelectorAll(静的NodeList)を使う。querySelector は常に1件だけ。
  • 読みやすいセレクタ: 長くなりすぎるセレクタは、親を変数に取って段階的に取得するとミスが減る。

よくあるハマりと対策

  • 間違ったセレクタ記法: クラスは「.」、IDは「#」。タグはそのまま。属性は [name="x"]。CSSと同じだと覚える。
  • 複数一致する前提で使う: 最初の1件しか返らない。全件処理は querySelectorAllforEach にする。
  • スコープが広すぎる: document 全体で探すと意図しない別の要素に当たる。親要素から querySelector すると安全。

練習問題(手を動かす)

<div class="card">
  <h2 class="title">Item A</h2>
  <button class="like">Like</button>
</div>
<div class="card">
  <h2 class="title">Item B</h2>
  <button class="like">Like</button>
</div>
<script>
  // 1) 最初の .card のタイトルを書き換える
  const firstTitle = document.querySelector(".card .title");
  if (firstTitle) firstTitle.textContent = "Item A (edited)";

  // 2) 最初の .like ボタンだけにイベントを付ける
  const firstLike = document.querySelector(".like");
  if (firstLike) {
    firstLike.addEventListener("click", () => console.log("Liked first card"));
  }

  // 3) 2つ目のカードに限定して要素取得(親からの相対)
  const secondCard = document.querySelectorAll(".card")[1];
  if (secondCard) {
    const likeInSecond = secondCard.querySelector(".like");
    likeInSecond.addEventListener("click", () => console.log("Liked second card"));
  }
</script>
HTML

直感的な指針

  • まずは「CSSセレクタで最初の1件」を取る、と覚える。見つからないと null。複数なら querySelectorAll。親からの相対検索で範囲を絞ると安全で読みやすい。
タイトルとURLをコピーしました