コース一覧
JavaScriptでWebページを動かす
要素を取得する

JavaScriptでWebページを動かす

DOM から要素を取得・更新・追加し、クリック・入力・フォーム送信に反応する処理を作る全 20 レッスン(411 分)のコースです。タイマーと localStorage も使い、最後は入力を保存できるひとことメモを仕上げます。用意された HTML/CSS を使うため、学習の中心は JavaScript です。

1
DOM のきほん
01. DOM とは何か15分
02. 要素を取得する20分
03. テキストを書き換える20分
04. class を付け外しする20分
05. 要素を作って追加する20分
06. 配列から一覧を描画する25分
07. つくる ギャラリーをデータ駆動にする30分
08. 第1章まとめクイズ10分
2
イベント処理
01. クリックに反応する18分
02. event オブジェクト20分
03. 入力欄の値を取る18分
04. フォーム送信を制御する20分
05. つくる ダークモード切替25分
06. つくる フォームの入力チェック25分
07. 第2章まとめクイズ10分
3
タイマーと総合制作
01. setTimeout と setInterval20分
02. localStorage で保存する20分
03. つくる ひとことメモウィジェット30分
04. 自由拡張30分
05. 完成と次のステップ15分

要素を取得する

querySelector と querySelectorAll
解説

このレッスンで分かること

  • querySelector は CSS のセレクタをそのまま使って、当たった要素を 1 つ返します
  • 全部ほしいときは querySelectorAll で受け取り、forEach でまわします

まず掴まないと、何ひとつ変えられない

DOM の操作は、いつも同じ 2 段階でできています。掴む、そして変える。文字を変えるにも色を変えるにも、先に「どれを」を決めなければいけません。その「どれを」を決めるのが querySelector です。

JavaScript

const nav = document.querySelector(".site-nav"); nav.setAttribute("data-checked", "yes"); // <nav class="site-nav" data-checked="yes"> になる

document はページ全体でした。そこから .site-nav に当たるものを探し、最初に見つかった 1 つを返します。丸かっこの中がそのまま CSS のセレクタなのがうれしいところです。タグ名なら "h2"、クラスなら ".hobby-item"、id なら "#about"。CSS で書いてきたとおりに当たります。ただし文字列なので、引用符で囲むのは忘れないでください。

2 行目の setAttribute は、要素に属性を 1 つ足す命令です。掴めたかどうかは目に見えないので、印を付けて確かめます。data- で始まる属性はデータ属性と呼ばれ、開発者が自由に付けてよい決まりです。見た目は変わりませんが、検証ツールの Elements タブを開けば、狙った要素にだけ印が付いているのが分かります。

4 つあるのに 1 つしか返ってこない

querySelector は、当たったうちの最初の 1 つしか返しません。趣味のリストには .hobby-item が 4 つありますが、返るのは「朝のさんぽ」だけです。

全部ほしいときは querySelectorAll を使います。返るのは NodeList という、当たった要素が順番に並んだものです。

JavaScript

const hobbies = document.querySelectorAll(".hobby-item"); console.log(hobbies.length); // 4 hobbies.forEach((hobby) => { hobby.setAttribute("data-checked", "yes"); });

NodeList は配列によく似ています。length があり、hobbies[0] で番号を指定でき、第6章で練習した forEach もそのまま効きます。ただし配列そのものではないので、map や filter は使えません。

書き方返るもの見つからないとき
querySelector(sel)最初に当たった要素 1 つnull
querySelectorAll(sel)NodeList (0 個以上)空の NodeList
getElementById(id)id が一致する要素 1 つnull

getElementById は id 専用の古くからある書き方で、# を付けずに document.getElementById("about") と書きます。速さの差はこの規模では出ないので、どちらでも構いません。

綴りを間違えても、その行では止まらない

つまずきどころはここです。当たらなかったとき、querySelector はエラーを出さずに null を返します。エラーになるのは、その null を使おうとした次の行です。

JavaScript

const menu = document.querySelector(".site-navi"); // 綴りが違う console.log(menu); // null menu.setAttribute("data-checked", "yes"); // ここで TypeError

コンソールには Cannot read properties of null と出ます。この文言を見たら、エラーが指す行ではなく、その要素を掴んだ行を疑ってください。セレクタの綴りが違うか、そもそも存在しないかのどちらかです。

解説

当たるかどうかは、書く前に検証ツールで確かめられます。Elements タブで Command + F (Windows は Ctrl + F) を押してセレクタを打つと、当たった要素が光って件数も出ます。

よくある間違い

  • セレクタの記号を忘れる — クラスなら .、id なら # が要ります。querySelector("tagline") は <tagline> というタグを探しにいくので当たりません。逆に getElementById では # を付けません
  • NodeList に直接プロパティを書く — hobbies.setAttribute(...) は入れ物への操作なので TypeError です。用があるのは中身 1 つずつなので、forEach でまわしてから呼びます

課題

  1. document.querySelector("h1") で見出しを掴み、setAttribute で data-found を "1" にする
  2. .tagline を querySelector で掴み、同じように data-found を "1" にする
  3. document.getElementById("works") で作品セクションを掴み、data-found を "1" にする
  4. querySelectorAll(".work-card") で 3 枚のカードを掴み、forEach で 1 枚ずつ data-found を "1" にする

ヒント

掴む、それから変える、の 2 段階です。まず変数に入れてから `setAttribute` を呼びます

属性を付けるのは `要素.setAttribute("data-found", "1")` です。値も文字列で渡します

`querySelectorAll` が返すのは要素そのものではありません。`forEach` で 1 つずつ取り出してから `setAttribute` を呼びます

index.html
style.css
script.js
プレビュー

できているか

  • h1 に data-found が付く
  • .tagline に data-found が付く
  • #works に data-found が付く
  • 3 枚の作品カード全部に data-found が付く
エディタを読み込んでいます