当我做类似divNode.appendChild(pNode)的操作时,pNode被移动到divNode内。看起来其父级已从原来的状态更改为divNode。这是预期的行为吗?

这是我的代码:http://jsfiddle.net/YqG96/

<html>
<head>
<style>
p {
    background: orange;
}
div {
    background: lightcyan;
    padding: 5px;
}
</style>
<script>
window.onload = function() {
    pNode = document.getElementById('pNode');
    divNode = document.getElementById('divNode');
    divNode.appendChild(pNode);
}
</script>
</head>
<body>
<p id="pNode">Foo</p>
<div id="divNode">Bar</div>
</body>
</html>

是否可以对其进行修改,以便pNodedivNode都保留在主体下面?如果一个节点的两个父节点没有意义,那么是否可以创建一个新的pNode副本并将此新副本附加到divNode上?

最佳答案

这是预期的行为。在DOM中已经存在的节点上执行appendChild()时,该节点将从其当前在DOM中的位置移动到您指定的新位置。这将同时更改其父节点以及下一个和上一个节点。

一个节点只能有一个直接父节点,因此不可能有两个父节点,因为每个父节点都表示该节点的位置,并且与粒子物理学的奥秘不同,一个节点一次只能位于一个位置。如果要在两个位置上有两个节点,则可以创建一个新节点并追加一个节点,也可以克隆现有节点并追加一个节点。

有关如何制作节点副本并将副本插入第二个位置的信息,请参见 cloneNode() function

<script>
window.onload = function() {
    pNode = document.getElementById('pNode').cloneNode(true);
    pNode.id = "pNode2";
    divNode = document.getElementById('divNode');
    divNode.appendChild(pNode);
}
</script>

请记住,克隆节点时,克隆树中任何具有ID的节点都将需要一个新ID,以便ID值在文档中保持唯一。

10-04 17:17