4

HTMLを持っているとき:

<div>
    <p id="first">First paragraph!</p>
    <p id="second">Second paragraph!</p>
</div>

そして、私はスクリプトを実行します:

var second = $('#second');
$('#second').insertBefore(second);

結果は次のとおりです。

<div>
    <p id="first">First paragraph!</p>
</div>

コードが無意味であることは知っていますが、挿入するアイテムが前に挿入したアイテムと同じである可能性があるコードを書いています。

上記の結果が得られた理由を誰かが理解するのを手伝ってもらえますか?どうしたの#second

4

2 に答える 2

5

W3C DOM 3仕様によると:

注:ノードをそれ自体の前に挿入することは、実装に依存します。

ノードを挿入するときに、ノードがすでにDOMにある場合は、最初に削除されます。そのため、DOMに存在しなくなったノード(それ自体)の前に挿入しようとしています。2つのノードが同じであるかどうかをテストする必要があります。同じである場合は、挿入を行わないでください。

編集

上記を実行するための単純なjs関数は次のとおりです。

function doInsert(insertNode, beforeNode) {
  if (insertNode != beforeNode) {
    beforeNode.parentNode.insertBefore(insertNode, beforeNode);
  }
}
于 2012-08-28T00:00:14.407 に答える
5

何が起こるべきかについての仕様は明確ではありませんが、私の推測は次のとおりです。

  1. #second最初にDOMから削除され、別の場所に挿入できるようになります。
  2. #secondここで、の前に挿入しようとします#secondが、はもうDOMにないため、移動する場所がありません。
于 2012-08-28T00:01:25.790 に答える