このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。

View in English Always switch to English

Document: moveBefore() メソッド

Limited availability

This feature is not Baseline because it does not work in some of the most widely-used browsers.

moveBefore()Document インターフェイスのメソッドで、指定された Node を DOM ノード Document 内の直接の子として、指定された参照ノードの前に移動します。

構文

js
moveBefore(movedNode, referenceNode)

引数

movedNode

移動するノードを表す Node。なお、これは Element または CharacterData ノードでなければなりません。

referenceNode

Node であり、 movedNode の移動先はこの前になります。または null です。この値が null であった場合、movedNodeDocument の子要素の末尾に挿入されます。

返値

なし (undefined)。

例外

HierarchyRequestError TypeError

以下のいずれかの場面で発生します。

  • 指定された movedNode がこの文書に属していない。
  • 指定された movedNodeElement または CharacterData ノードではない。
  • movedNode をこの文書の doctypeDocumentType オブジェクトで表される)の前に移動しようとした。
NotFoundError TypeError

指定された referenceNode は、moveBefore() を呼び出したノードの子ノードではない。つまり、movedNode の移動先ノードの子ノードではない。

TypeError TypeError

2 つ目の引数が指定されていない。

解説

moveBefore() メソッドは、指定されたノードをこの DOM 内の新しい場所に移動します。これは Node.insertBefore() メソッドと同様の機能を提供しますが、ノードを除去せずに、再挿入される点が異なります。つまり、 insertBefore() や類似のメカニズムで移動した場合にリセットされる、次のようなノードの状態が、移動後も保持されます。

<video> および <audio> 要素の再生状態は、以上の一覧には含まれません。これらの要素は、使用される仕組みに関わらず、除去され再挿入された後も状態を保持するからです。

MutationObserver を使用して DOM の変更を監視する場合、moveBefore() で移動されたノードは除去されたノード追加されたノードとして記録されます。

moveBefore() メソッドは、Document ノードに対して呼び出しても特に有用ではありません。要素以外の用途もいくつかあり、例えば moveBefore() を使用して Document のルート周辺のコメントノードを移動させることが可能です。しかし、個々の DocumentFragmentElement に対してそれを呼び出す用途を探す方がはるかに一般的です。詳細は DocumentFragment.moveBefore() および Element.moveBefore() を参照してください。

moveBefore() の制約

moveBefore() を使用する際には、いくつか留意すべき制約があります。

  • 同じ文書内でノードを移動する場合にのみ、動作します。
  • DOM に接続されていないノードを既に接続済みの親ノードに移そうとした場合、またはその逆の場合、動作しません。

このような場合、moveBefore()HierarchyRequestError 例外で失敗します。上記の制約が具体的な用途で必要となる場合、代わりに Node.insertBefore() を使用するか、try...catch を使用して、このようなケースで発生するエラーを処理する必要があります。

moveBefore() でコメントノードを移動

このデモでは、document.moveBefore() を使用してコメントノードをDOM内で移動する方法を示して表示させます。

HTML

この HTML は最小限のテンプレートであり、<body> 内にコメントがあるのが特徴です。

html
<!doctype html>
<html lang="ja">
  <head>
    <meta charset="utf-8" />
    <title>document.moveBefore() の例</title>
  </head>
  <body>
    <!-- このコメントは文書の終わりに置くべきである -->
    <p>コンテンツ</p>
  </body>
</html>

JavaScript

このスクリプトでは、<body> 要素のすべて childNodes をループ処理します。nodeType の値が 8(コメントノードを示す)のノードを見つけた場合、その参照を commentNode という変数に保存します。次に、document.moveBefore() を呼び出し、コメントノードを移動されることを指定し、2 つ目の引数として null を指定して、コメントを Document の子ノードの末尾に挿入します。

js
let commentNode;

for (node of document.querySelector("body").childNodes) {
  if (node.nodeType === 8) {
    commentNode = node;
  }
}

document.moveBefore(commentNode, null);

結果

レンダリングされた例は以下のようになります。

ブラウザーの開発者ツールでこの例を調べると、コメントが文書の終わり、終了タグ </html> の後に移動されていることに気づくでしょう。

仕様書

Specification
DOM
# dom-parentnode-movebefore

ブラウザーの互換性

関連情報