以下では、DOM の「要素の追加」に関する 4 つの代表的メソッド — appendChild, append, prepend, insertBefore — を体系的に解説します。いずれも「既存ノードの子として新しいノードを挿入する」操作ですが、受け取れる引数・戻り値・挿入位置・例外発生条件などに違いがあります。
1. 共通の基本概念
-
「追加」は原則 “移動”
同じドキュメント中の既存ノードを追加すると、そのノードは元の位置から取り外され、新しい位置に移動します(複製はされません)。複製したい場合はnode.cloneNode(true/false)を使います。 -
再フロー・再描画
追加のたびにレイアウト計算が発生し得ます。多数追加する場合は DocumentFragment の活用が有効です(後述)。 -
Node vs ParentNode
-
appendChild,insertBeforeは Node インターフェースのメソッド(Element,Document,DocumentFragmentなどが使用可)。 -
append,prependは ParentNode ミックスイン由来で、Element,Document,DocumentFragmentで使用可。
-
2. appendChild(node)
-
構文
-
引数:
Node(テキストを直接は渡せません。文字列を入れたい場合はdocument.createTextNode("...")を作って渡す) -
戻り値: 挿入された childNode(Node)
-
挙動:
parentの末尾に 1 個のノードを追加 -
例外
-
HierarchyRequestError: 親子関係として不正な組み合わせ -
NotFoundError: 参照ノード(insertBeforeの場合)や親が不正 など
-
-
使用例
3. append(…nodesOrStrings)
-
構文
-
引数:
Nodeと 文字列 を複数渡せる(文字列は自動でTextノード化) -
戻り値: なし(undefined)
-
挙動:
parentの末尾に引数を左から順に追加 -
強み
-
文字列を直接渡せる
-
複数を一度に追加できる(
appendChildは 1 個ずつ)
-
-
注意
-
IE など非常に古い環境では未対応(モダン環境では一般的に使用可)
-
-
使用例
4. prepend(…nodesOrStrings)
-
構文
-
引数:
Nodeと 文字列 を複数 -
戻り値: なし(undefined)
-
挙動:
parentの先頭(最初の子の前)に引数を順に追加 -
使用例
5. insertBefore(newNode, referenceNode)
-
構文
-
引数
-
newNode: 追加したいNode -
referenceNode:parentの子でなければならない参照ノード
-
-
戻り値: 挿入された newNode(Node)
-
挙動:
referenceNodeの直前にnewNodeを追加 -
特殊ケース
-
referenceNodeにnullを渡すとappendChild(newNode)と同等(末尾に追加)
-
-
例外
-
NotFoundError:referenceNodeがparentの子でない -
HierarchyRequestError: 不正な親子関係
-
-
使用例(任意の位置に挿入)
-
「直後に挿入(insertAfter)」相当
insertAfterは存在しません。以下のようにnextSiblingを使います。
6. 使い分けの早見表
| 目的 / 性質 | appendChild | append | prepend | insertBefore |
|---|---|---|---|---|
| 末尾に追加 | ◎ | ◎ | – | 参照が null なら可 |
| 先頭に追加 | – | – | ◎ | 参照に firstChild を渡す |
| 文字列を直接渡せる | × | ◎ | ◎ | × |
| 複数引数で一括追加 | × | ◎ | ◎ | × |
| 戻り値(挿入ノードを返す) | ◎ | × | × | ◎ |
| 厳密な例外でのエラー検出がしやすい | ◎ | △ | △ | ◎ |
| 任意位置に挿入(基準ノードの前) | △(不可) | △(不可) | △(不可) | ◎ |
-
実務指針
-
「末尾に数個・文字列もまとめて」→
append -
「先頭に追加」→
prepend -
「戻り値が必要/厳密な検証をしたい」→
appendChild/insertBefore -
「特定ノードの直前に入れたい」→
insertBefore
-
7. DocumentFragment でまとめて高速追加
多数のノードを 1 回で追加して reflow を抑えるテクニックです。
append/prepend でも frag をそのまま渡せます。
8. よくある注意点・落とし穴
-
テキスト vs HTML
テキストを挿入したいだけならappend("text")で十分です。HTML を解釈させて挿入したいならinnerHTMLを使いますが、XSS の危険があるため、外部入力をそのまま入れないこと。安全に HTML を組み立てるなら createElement + プロパティ設定 を基本にします。 -
参照ノードの所属(
insertBefore)
referenceNodeは必ずparentの実子である必要があります。そうでないとNotFoundError。 -
ノードの“所有ドキュメント”
別ドキュメント(iframeなど)から持ってきたノードは、通常自動でインポートされますが、環境によってはdocument.importNode()が必要な場面があり得ます。 -
同一ノードの再追加は移動になる
既存のliを別の場所にappendChildすると、元の場所から消えて新しい場所へ移ります。複数箇所に同じものを置きたい場合はcloneNode(true)を使います。
9. 具体例まとめ
9.1 末尾に複数・文字列も一括(append)
9.2 先頭に見出しを追加(prepend)
9.3 任意位置に 1 件挿入(insertBefore)
9.4 旧来コードとの互換・戻り値が必要(appendChild)
10. まとめ
-
末尾へ柔軟に: append(文字列可・複数可・戻り値なし)
-
先頭へ: prepend(文字列可・複数可・戻り値なし)
-
厳密・戻り値必要: appendChild(1 ノードのみ・戻り値あり)
-
任意位置: insertBefore(参照ノード直前・戻り値あり)
-
大量追加は DocumentFragment でバッチ化し、性能と可読性を上げる。
ChatGPT5 生成日:2025/09/11