DOMの構造:「親ノード・子ノード・兄弟ノード」
1) 基本の定義
-
親ノード (parent node)
あるノードを直接含んでいる上位のノード。ツリーを遡ると必ず 0 個または 1 個だけ存在します。
例:<body>は<main>の親ノード。 -
子ノード (child node)
あるノードが直接含んでいる下位のノード群。0 個以上。
例:<ul>の子ノードには<li>要素や改行に由来するテキストノードが含まれることがあります。 -
兄弟ノード (sibling nodes)
同じ親を共有するノード同士。順序はツリー上の並びに従います。
例:同じ<ul>配下の複数の<li>は兄弟。
重要:DOM の「ノード」は要素だけでなく、テキストやコメントなども含みます(要素だけに限定したい場合は Element 系 API を使います)。
2) 代表的なプロパティとメソッド
-
親関係
-
node.parentNode(親が Document/DocumentFragment でも取得) -
element.parentElement(親が要素のときのみ)
-
-
子関係
-
node.childNodes(全ノードの子:NodeList) -
element.children(要素ノードのみ:HTMLCollection、ライブコレクション) -
firstChild/lastChild(全ノード) -
firstElementChild/lastElementChild(要素のみ)
-
-
兄弟関係
-
previousSibling/nextSibling(全ノード) -
previousElementSibling/nextElementSibling(要素のみ)
-
-
走査と操作(要素中心の近年の API)
-
祖先検索:
element.closest(selector) -
子孫検索:
element.querySelector(All) -
追加:
parent.append(node | ...nodes),parent.prepend(...) -
挿入:
ref.before(...),ref.after(...),parent.insertBefore(newNode, refNode) -
置換/削除:
ref.replaceWith(...),node.remove(),parent.removeChild(node)
-
-
判定/比較
-
node.contains(other)(自分が祖先か) -
node.compareDocumentPosition(other)(文書順の前後関係) -
node.nodeType(1:要素, 3:テキスト, 8:コメント, 9:Document, 11:DocumentFragment)
-
3) ミニサンプル(HTML と JS)
HTML
親・子・兄弟の取得
ノード挿入・削除
4) よくある落とし穴
-
空白や改行によるテキストノード
整形のための改行・スペースもchildNodesに含まれます。要素だけを扱いたいならchildrenやfirstElementChild/nextElementSiblingを使用します。 -
ライブコレクション vs スナップショット
childrenはライブ(DOM 変更が即時反映)、querySelectorAllの返すNodeListは多くの環境でスナップショット。反復中に DOM を変更するなら配列にコピーしてから操作すると安全です。 -
親の型
parentNodeはDocumentやDocumentFragmentを返すことがあります。常に要素を期待する場合はparentElementを使うか型をチェックします。 -
要素とノードの API の混在
兄弟を要素に限定したいときにpreviousSibling/nextSiblingを使うとテキストやコメントに当たることがあります。Element 系(previousElementSiblingなど)を選びます。
5) 実用パターン
-
特定の祖先を見つけたい
-
子の反復(要素のみ)
-
兄弟間の並び替え
-
包含関係の確認
6) まとめ
-
親・子・兄弟は直接の階層関係であることがポイント。
-
「要素だけ」扱うか「すべてのノード」を扱うかで Element 系 API と Node 系 API を使い分けます。
-
改行テキストやライブコレクションなどの挙動差を把握しておくと、走査・挿入・削除・並び替えが安定します。
ChatGPT5 生成日:2025/09/11