首先看下面一段代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <div id="box"> <p>参考的P标签元素</p> </div> <hr> <div id="target"> <p>p text 1</p> <p>p text 2</p> <p>p text 3</p> <p>p text 4</p> <p><center>[wp_ad_camp_2]</center></p><p>p text 5</p> </div> <script> var box = document.getElementById("box"); var target = document.getElementById("target"); var targetChildrens = target.children; for (var i = 0; i < targetChildrens.length; i++) { box.appendChild(targetChildrens[i]); } </script> |
我们知道使用
所以可以看出,这段代码的意图是想把 id 为
如果想复制而不是移动追加,那么就需要使用
1 | node.cloneNode(deep); |
其中
node: 被克隆节点
deep: 可选,默认为 false。如果传递给它的参数是 true,它还将递归复制当前节点的所有子孙节点。否则,它只复制当前节点,
所以可以将代码段中的
1 | box.appendChild( targetChildrens[i].cloneNode(true) ); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <div id="box"> <p>参考的P标签元素</p> </div> <script> var box = document.getElementById("box"); var target = document.getElementById("target"); for(var i = 1; i <= 5; i++){ var p = document.createElement("p"); var textNode = document.createTextNode('动态添加的p标签' + i); p.appendChild(textNode); box.appendChild(p); } </script> |

当没使用

你也许会有疑问,为啥只有1、3、5被追加了,而2、4还留在原地呢?其实就跟开始讲的 appendChild
让我们来分析一下,因为有5个节点,所以会遍历5次:
1)、第一次遍历(
2)、第二次遍历,由于节点对象
1 2 3 4 5 6 | { 0: <p>p text 2</p>, 1: <p>p text 3</p>, 2: <p>p text 4</p>, 3: <p>p text 5</p> } |
此时
3)同理,第三次遍历,
1 2 3 4 5 | { 0: <p>p text 2</p>, 1: <p>p text 4</p>, 2: <p>p text 5</p> } |
此时
4)其实没有第四次遍历了,就是说我们理所当然的五次遍历是
1 2 3 4 5 6 | var targetChildrens = target.children; for (var i = 0; i < targetChildrens.length; i++) { console.log("i", i); console.log("targetChildrens", targetChildrens); box.appendChild(targetChildrens[i]); } |

当使用
1 | box.appendChild( targetChildrens[i].cloneNode(true) ); |

后记,与