Node: appendChild() メソッド
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
appendChild()
は Node
インターフェイスのメソッドで、指定された親ノードの子ノードリストの末尾にノードを追加します。追加しようとしたノードが既に存在していた場合は、 appendChild()
はその子ノードを現在の位置から新しい位置へ移動します。
指定された子ノードが DocumentFragment
であった場合、その
DocumentFragment
の内容全体が指定された親ノードの子ノードリストに移動します。
appendChild()
は、新しく追加されたノードを返します。また、子が DocumentFragment
であれば、空になったフラグメントを返します。
メモ: このメソッドとは異なり、 Element.append()
メソッドは複数の引数や文字列の追加に対応しています。ノードが要素であった場合は、こちらを使用することができます。
構文
appendChild(aChild)
引数
aChild
-
指定された親ノードに追加するノード(ふつうは要素)。
返値
Node
で追加された子ノード (aChild
) を返します。
ただし、 aChild
が DocumentFragment
であった場合は、空の DocumentFragment
を返します。
例外
HierarchyRequestError
DOMException
-
DOM ツリーの制約に違反した場合に発生します。すなわち、以下のいずれかが発生する場合です。
aChild
の親がDocument
,DocumentFragment
,Element
のいずれにもならない場合。aChild
を挿入すると循環参照になる場合。すなわちaChild
がこのノードの祖先である場合。aChild
がDocumentFragment
,DocumentType
,Element
,CharacterData
のいずれでもない場合。- 現在のノードが
Text
であり、親ノードがDocument
になる場合。 - 現在のノードが
DocumentType
であり、その親がDocument
にならない場合。 doctype は常に document の直下になければならないからです。 - このノードの親が
Document
でaChild
がDocumentFragment
であり、複数のElement
の子、またはText
の子がある場合。 aChild
を挿入するとDocument
の子のElement
が複数になる場合。
解説
指定された子ノードが文書内の既存のノードへの参照である場合、 appendChild()
はそのノードを現在の位置から新しい位置に移動させます。つまり、あるノードが文書内の2点に同時に存在することはできません。新しい親の下にノードを追加する前に、ノードのコピーを作成するには Node.cloneNode()
メソッドを使用することができます。cloneNode
で作成されたコピーは、自動的に同期されるわけではありません。
appendChild()
は親ノードではなく、新しく追加されたノードを返します。つまり、新しいノードが作成されたらすぐに、そのノードへの参照を失うことなく、追加することができます。
const paragraph = document.body.appendChild(document.createElement("p"));
// 段落に後から要素を追加することも可能です
一方で、appendChild()
は fluent API 流に(JQuery のように)使用することはできません。
// 3 つの段落を追加することはできません。
// 代わりに、3 つの段落は入れ子になります。
document.body
.appendChild(document.createElement("p"))
.appendChild(document.createElement("p"))
.appendChild(document.createElement("p"));
例
本文に段落を追加
// 新しい段落要素を作成し、文書の body の末尾に追加します。
const p = document.createElement("p");
document.body.appendChild(p);
入れ子構造の DOM の作成
この例では、いくつかある一時変数をできるだけ使用して、入れ子の DOM 構造を作成することを試みています。
const fragment = document.createDocumentFragment();
const li = fragment
.appendChild(document.createElement("section"))
.appendChild(document.createElement("ul"))
.appendChild(document.createElement("li"));
li.textContent = "hello world";
document.body.appendChild(fragment);
以下のような DOM ツリーが生成されます。
<section>
<ul>
<li>hello world</li>
</ul>
</section>
仕様書
Specification |
---|
DOM Standard # dom-node-appendchild |
ブラウザーの互換性
BCD tables only load in the browser