Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

DOMツリー

前のセクションで DOM(ドム)ツリー について、少しだけ触れました。しかし、その中には、「ブラウザに表示ひょうじされているHTML(ウェブページの中身) すべて」が含まれています。とてもたくさんの種類のオブジェクトが含まれます。

そのため、ここで新たなセクションを作って、もっと詳しく解説します。


I. DOMとは?

1. DOMツリーってなに?

DOMは Document Object Model のりゃくです。 ブラウザはHTMLファイルをむと、それをそのまま表示ひょうじするのではなく、まず扱いやすいように 枝分えだわかれした木(Tree)」 の形に並べかえます。これがDOMツリーです。

DOMノードツリー

DOM node tree“ by Yuho.K is licensed under CC BY-SA 4.0. This file is licensed under the Creative Commons Attribution-Share Alike 4.0 International license.

2. ツリーの「」と「関係」

DOMツリーを理解するコツは、**「家族(かぞく)」**の名前にたとえて覚えることです。

  • Document(ルート): 木の「っこ」です。一番上にあります。
  • Parent(親): ある要素の、すぐ上にある要素。
  • Child(子): ある要素の、すぐ中(下)にある要素。
  • Sibling(兄弟): 同じ親から生まれた、横に並んでいる要素。

れい <ul>(親)の中に、3つの <li>(子)があるとき、3つの <li> 同士どうしは「兄弟」になります。

3. なぜ「ツリー」にするの?

なぜわざわざ「木」の形にするのでしょうか? それは、JavaScriptという「魔法まほう使つかい」が、特定のパーツをすぐに見つけやすくするためです。

  • 「一番上の親を赤くして!」
  • 「2番目の兄弟を消して!」
  • 「この子の隣(となり)に、新しい子を追加して!」

このように、ツリーの枝をたどるように命令ができるので、非常に便利なのです。

4. DOM操作(そうさ)のイメージ

留学生には、DOM操作を 「木になっているリンゴ(要素)を、もぎ取ったり、別の場所に植え替えたりする作業」 だと伝えてください。

  1. 見つける(Select): querySelector などを使って、目的の枝まで行く。
  2. 変える(Change): styletextContent で色や文字を変える。
  3. 追加・削除(Update): appendChild で新しい枝を付けたり、remove で枝を切ったりする。

5. 留学生へのアドバイス

「HTMLファイルはただの『文字の集まり(テキスト)』だけど、ブラウザがそれを DOMツリーという『生きている木』 に変えてくれるんだ。 JavaScriptはこの木を自由に育てるための道具だよ。木の関係(親・子・兄弟)が分かれば、どんな複雑なページも自由に操(あやつ)れるようになるよ!」

まとめテーブル

専門用語意味家族でたとえると?
Documentツリー全体の入り口ご先祖(せんぞ)様
Element<div><p> などの要素家族の一人ひとり
Parent Nodeすぐ上の要素お父さん・お母さん
Child Nodeすぐ下の要素息子・娘
Sibling同じ階層かいそうにある要素兄・妹

いかがでしょうか?「木の関係図」というイメージが持てれば、DOM操作はぐっと簡単になります。

II. Formオブジェクト

ウェブサイトで自分の名前を入力にゅうりょくしたり、アンケートに答えたりするときに使うのが「フォーム(お問い合わせ、ログイン画面がめんなど)」です。

JavaScriptでは、これらを Formオブジェクト として扱います。留学生の方には、Formオブジェクトは**「役所の窓口(まどぐち)」**だと教えてあげてください。


1. Formオブジェクトとは?

HTMLの <form> タグで囲まれた部分のことです。ユーザーが入力にゅうりょくしたデータをまとめて管理し、サーバー(裏側うらがわのコンピュータ)へ送る準備をする役割(やくわり)を持っています。

JavaScriptでは、主に以下の2つの方法でフォームを捕まえ(アクセスし)ます。

  1. document.forms[0] (ページにある1番目のフォーム)
  2. document.getElementById("myForm") (ID名で指定)

2. よく使うプロパティ(フォームの情報)

窓口(フォーム)が持っている設定せってい情報です。

  • name フォームの名前です。複数のフォームがあるときに区別するために使つかいます。
  • action データをどこ(どのURL)に送るかという「宛先あてさき(あてさき)」です。
  • method データの送り方です。主に GET(URLにのせる)か POST(封筒に入れる)のどちらかです。
  • elements フォームの中にあるボタンや入力にゅうりょく欄(入力にゅうりょくパーツ)を、配列はいれつのような形でまとめて持っています。

3. よく使うメソッド(フォームを動かす)

  • submit()送信そうしん(そうしん)ボタン」を押さなくても、JavaScriptから強制きょうせい的にデータを送ります。
  • reset() 入力にゅうりょくした内容をすべて消して、最初の状態(空っぽ)に戻します。

4. フォームの中の「入力にゅうりょくパーツ」の操作

留学生が一番やりたいのは、**「ユーザーが書いた文字を読み取ること」**です。これは、各パーツの value(バリュー) プロパティを使つかいます。

// 1. フォーム全体を取得(しゅとく)
const myForm = document.forms["loginForm"];

// 2. ユーザーが書いた「ユーザー名」を取り出す
const userName = myForm.elements["uName"].value;

// 3. 送信(そうしん)する前にチェックする
if (userName === "") {
  alert("名前を書いてください!");
} else {
  myForm.submit(); // 問題なければ送信(そうしん)!
}


5. 留学生への説明ポイント:onsubmit イベント

データを送る瞬間に「ちょっと待って!今の入力にゅうりょく、間違っていない?」とチェックする機能がよく使われます。

onsubmit は、窓口で書類(しょるい)を渡す前の『最終チェック』だよ。もし書き忘れがあったら return false と言って、送信そうしんをストップさせるんだよ」

myForm.onsubmit = function() {
  if (this.elements["email"].value === "") {
    alert("メールアドレスが必要です!");
    return false; // 送信(そうしん)を中止(キャンセル)する
  }
  return true; // 送信(そうしん)する
};


まとめテーブル

プロパティ・メソッド役割たとえ話
elements全パーツのリスト窓口にある書類の束(たば)
value入力にゅうりょくされた文字書類に書かれた内容
submit()送信そうしんする書類を受け付けて送る
reset()リセットする書類をゴミ箱に捨てて新しくする

Tip

「id」と「name」の使つか 留学生には、「JavaScriptでデザインを変えるときは id、サーバーにデータを送るときは name を使うのが一般的だよ」 と教えてあげると、混乱が少なくなります。

いかがでしょうか?「窓口」と「書類」のイメージで、フォームの操作もバッチリですね。

次は、チェックボックスやラジオボタンなど、文字入力にゅうりょく以外のパーツを操作する方法についても練習してみますか?

III. Elementオブジェクト

前回ぜんかいdocument が「現場監督(げんばかんとく)」なら、今回の Element オブジェクトは、現場にある**「レンガや窓、ドアといったひとつひとつの『部品(パーツ)』」**のことです。

HTMLタグ(<div>, <h1>, <a> など)が、JavaScriptの世界で「Elementオブジェクト」と呼ばれます。


1. Elementオブジェクトとは?

ウェブページを構成する「ひとつひとつの要素」です。 document.getElementById() などで見つけてきたものは、すべてこのElementオブジェクトになります。これを使うことで、特定のパーツだけの色を変えたり、文字をかええたりできます。


2. よく使うプロパティ(パーツの状態)

そのパーツがどんな状態(じょうたい)かを知るためのプロパティです。

**id / className**

HTMLの idclass の名前です。

  • 注意: JavaScriptでは class は予約語(特別な言葉)なので、プロパティ名は className と書きます。

**innerHTML / textContent**

パーツの中身(文字やタグ)です。

  • textContent:中の「文字」だけを扱います。(安全でおすすめ!)
  • innerHTML:中の「HTMLタグ」も含めて扱います。

style

(CSS)を直接いじります。

  • れい element.style.color = "blue";

attributes

そのタグについている「属性ぞくせいはなし」のリストです。


3. よく使うメソッド(パーツへの操作)

パーツに対して「何かをする」ための命令です。

属性ぞくせい(じょうほう)を操作する

  • getAttribute("<ruby>属性<rt>ぞくせい</rt></ruby>名")設定せっていされている値(srchref など)を読み取ります。
  • setAttribute("<ruby>属性<rt>ぞくせい</rt></ruby>名", "値"):新しく値をセットします。
  • removeAttribute("<ruby>属性<rt>ぞくせい</rt></ruby>名")設定せっていを消します。

クラスを操作する(とても便利!)

  • classList.add("クラス名"):クラスを追加する。
  • classList.remove("クラス名"):クラスを消す。
  • classList.toggle("クラス名"):あれば消す、なければ追加する。

パーツを動かす

  • remove():そのパーツを画面がめんから消します。

4. 実際に動かしてみよう!

留学生に「画像がぞうきりえるボタン」の仕組しくみを説明するコードれいです。

// 1. <img>タグ(Elementオブジェクト)を見つける
const myImage = document.querySelector("#profile-pic");

// 2. setAttribute で画像(がぞう)のURLを変える
myImage.setAttribute("src", "new-image.jpg");

// 3. classList でデザインを切(きり)り替(か)える
myImage.classList.add("rounded-frame");


5. 留学生へのアドバイス:innerHTML の注意点

留学生がよくやってしまう「危ないかた」について、一言教えてあげてください。

innerHTML は便利だけど、ユーザーが入力にゅうりょくした文字をそのまま入れると、悪いプログラム(ウイルスなど)が動かされる危険があるんだ。 ただの文字を表示ひょうじしたいときは、必ず textContent を使おうね!


まとめテーブル

プロパティ・メソッド役割たとえ話
idID名パーツの「名前ラベル」
styleCSSデザインパーツの「服の色やサイズ」
textContent中のテキストパーツに書いてある「看板の文字」
setAttribute()設定せっていを変える窓を「開ける」か「閉める」か設定せっていする
classListクラスの管理パーツに「タグ(目印)」を貼ったり剥がしたりする

いかがでしょうか?Elementオブジェクトを使つかいこなせれば、ユーザーのうごきに合わせて画面がめん動的どうてきに変える「動くサイト」が作れるようになります!

IV. DOMツリーを使ったエレメントの取得しゅとく

DOMツリーの「家族(親子おやこ・兄弟)」の関係がわかったら、次は実際に**「その枝(え要素)をたどって、操作する方法」**を学びましょう!

留学生の方には、**「住所を知らなくても、家系図かけいずをたどれば目的の人に会える」**というイメージで説明するとわかりやすくなります。


1. 要素の関係(プロパティ)を使ってたどる

IDやクラス名を使わなくても、今いる場所から「隣の人」や「親」を指名できます。

  • parentNode(親): 自分のすぐ上の要素。
  • children(子): 自分のなかにいる要素たちのリスト。
  • previousElementSibling(前の兄弟): 自分のすぐ上(前)にある同じレベルの要素。
  • nextElementSibling(次の兄弟): 自分のすぐ下(後)にある同じレベルの要素。

2. 実際にたどって操作するコード

たとえば、リスト(<ul>)の中の「2番目の項目」からスタートして、周りを操作してみましょう。

// 1. まず、真ん中(まんなか)の「2番目」を捕まえる
const centerItem = document.getElementById("item2");

// 2. 「親」の背景(はいけい)色を変える(リスト全体がオレンジに!)
centerItem.parentNode.style.backgroundColor = "orange";

// 3. 「前の兄弟(1番目)」の文字を大きくする
centerItem.previousElementSibling.style.fontSize = "25px";

// 4. 「次の兄弟(3番目)」を消してしまう
centerItem.nextElementSibling.remove();


3. 要素を「追加」する(新しい枝を増やす)

DOMツリーに新しい要素を加えるときは、**「部品を作って、親に渡す」**という2ステップが必要です。

  1. document.createElement("タグ名"): 新しい要素をメモリの中に作ります(まだ画面がめんには出ません)。
  2. 親要素.appendChild(新しい要素): 親の「最後の子」としてツリーに追加します。
// ① 新しい <li> を作る
const newLi = document.createElement("li");
newLi.textContent = "新しい家族です!";

// ② <ul> を見つけて、その中に入れる
const list = document.querySelector("ul");
list.appendChild(newLi);


4. 留学生へのアドバイス:Elementを忘れないで!

ここでよくある間違いを教えてあげてください。

nextSibling(兄弟)」と「nextElementSibling要素の兄弟)」は似ているけど違うんだ。 nextSibling は、目に見えない『改行かいぎょう(かいぎょう)』や『スペース』も1つの枝として数えてしまうことがある。 「HTMLタグだけをたどりたいときは、名前に『Element』が入っている方を使おうね!」


まとめテーブル:たどるための魔法まほう

魔法まほうの言葉行き先
parentElementお父さん・お母さんのところへ
firstElementChild長男・長女のところへ
lastElementChild末っ子のところへ
nextElementSibling弟・妹のところへ
previousElementSibling兄・姉のところへ

いかがでしょうか?「今いる場所」を基準にツリーを移動できるようになると、まるで迷路を攻略するように自由にHTMLを操作できるようになります。

V. 要素の生成・追加・削除

DOMツリーの操作の中でも、**「新しく作る(生成)」「仲間に入れる(追加)」「さよならする(削除)」**の3つは、もっともワクワクする部分です。

留学生の方には、**「レゴブロックで新しいパーツを作って、てたり外したりする遊び」**と同じだと教えてあげてください。


1. 要素を「作る(生成)」

まずは、魔法まほうを使って何もないところにパーツを誕生させます。

  • document.createElement("タグ名") 指定したタグ(div, li, p など)を新しく作ります。

注意: この時点では、まだ「メモリの中」にあるだけで、画面がめんには見えません。

// 「たこ焼き(li)」というパーツを1つ作る
const takoyaki = document.createElement("li");

// 中身の文字を入れる
takoyaki.textContent = "たこ焼き 🐙";


2. 要素を「入れる(追加)」

作ったパーツを、DOMツリーのどこに置くかを決めます。

appendChild(新しい要素)

親要素の**「一番最後の子」**として追加します。一番よく使つかいます。

const list = document.getElementById("food-list");
list.appendChild(takoyaki); // リストの最後にたこ焼きが登場!

insertBefore(新しい要素, 目印にする要素)

「一番最後じゃなくて、この要素のに入れたい!」というときに使つかいます。


3. 要素を「消す(削除)」

いらなくなったパーツをツリーからのぞきます。

要素.remove()

その要素を自分自身で消去しょうきょします。とても簡単です!

const badApple = document.getElementById("rotten");
badApple.remove(); // 画面(がめん)から消える

親要素.removeChild(子要素)

昔からある方法で、「親が子をのぞく」というかたです。


4. 実際に動かしてみよう!

留学生に「ToDoリストに項目を追加して、クリックしたら消える」という魔法まほうのような体験たいけんをさせてあげましょう。

function addNote() {
  // 1. 生成:新しい <li> を作る
  const item = document.createElement("li");
  item.textContent = "勉強する 📖";

  // 2. 追加:リストの中に入れる
  const todoList = document.querySelector("#todo");
  todoList.appendChild(item);

  // 3. 削除の準備:クリックされたら消えるようにする
  item.onclick = function() {
    this.remove(); 
  };
}


5. 留学生へのアドバイス

「要素を作ったら、**『テキスト(textContent)』『色(style)』をセットして、最後に『親(appendChild)』**に渡す。この 『作る → 飾る → 貼る』 の3ステップが基本だよ!」


まとめテーブル

操作使う魔法まほう(メソッド)イメージ
生成(作る)createElement()レゴの新しいピースを用意する
追加(最後へ)appendChild()列の最後尾に並ばせる
追加(割り込み)insertBefore()「お先に失礼!」と間に入る
削除(消す)remove()舞台(ぶたい)から退場する

いかがでしょうか?「生成・追加・削除」ができるようになると、ユーザーがボタンを押すたびに画面がめんがどんどん変わる、本格的なアプリが作れるようになります。