Jon*_*ood 4 javascript jquery dom
当我有HTML时:
<div>
<p id="first">First paragraph!</p>
<p id="second">Second paragraph!</p>
</div>
Run Code Online (Sandbox Code Playgroud)
我运行脚本:
var second = $('#second');
$('#second').insertBefore(second);
Run Code Online (Sandbox Code Playgroud)
结果是:
<div>
<p id="first">First paragraph!</p>
</div>
Run Code Online (Sandbox Code Playgroud)
我知道代码是荒谬的,但我正在编写代码,我插入的项目可能与我之前插入的项目相同.
有人可以帮我理解为什么我得到上面的结果?发生什么事了#second?
根据W3C DOM 3规范:
注意:在自身之前插入节点取决于实现.
插入节点时,如果它已经在DOM中,则首先将其删除.因此,您尝试在不再位于DOM中的节点(本身)之前插入它.您应该测试两个节点是否相同,如果是,则不要执行插入.
执行上述操作的普通js函数是:
function doInsert(insertNode, beforeNode) {
if (insertNode != beforeNode) {
beforeNode.parentNode.insertBefore(insertNode, beforeNode);
}
}
Run Code Online (Sandbox Code Playgroud)
虽然规范不清楚应该发生什么,但我的猜测是:
#second 首先从DOM中删除它,以便它可以插入其他地方.#second,但是,因为#second不再是DOM,它没有地方可去.