【发布时间】:2021-12-09 03:03:00
【问题描述】:
我需要将子元素包装在 wrap-of-parent 中。在包装之前为父元素和子元素添加一些属性。在下面描述的代码中,如果孩子在单独的一行中位于另一个之下,并且如果它们在一行中,则所有其他孩子都插入到父包裹中。为什么会发生这种情况以及如何解决?
我明白了:
<div id="container">
<div id="parent1">
<div id="child1"></div>
<div id="child2"></div>
<div id="wrap-of-parent1">
<div id="child3"></div>
<div id="child4"></div>
</div>
</div>
我需要得到:
<div id="container">
<div id="parent1">
<div id="wrap-of-parent1">
<div id="child1"></div>
<div id="child2"></div>
<div id="child3"></div>
<div id="child4"></div>
</div>
</div>
代码:
var container = document.getElementById("container");
const parentDivs = container.querySelectorAll(":scope *"); //if child elements also have child elements, to wrap in
for (let parent of parentDivs) {
// create a new div
let wrap = document.createElement('div');
wrap.id = 'wrap-of-' + parent.id;
// move the parent's children to it
let children = parent.childNodes;
for (let i = 0; i < children.length; i++) {
if (children[i].nodeType === Node.ELEMENT_NODE) {
children[i].setAttribute("data", "somedata");
wrap.append(children[i]);
}}
// and append it to the parent
parent.appendChild(wrap);
}
<div id="container">
<div id="parent1">
<div id="child1"></div><div id="child2"></div><div id="child3"></div><div id="child4"></div>
</div>
</div>
<! - If the child elements are one below the other in a separate row it works, if they are in one row it does not work ->
【问题讨论】:
-
一个元素只能在DOM中的一个地方。当您将子元素移入包装器时,它会从
.childNodes列表中消失,因此当您增加循环索引时,您会跳过一个元素。 -
您正在改变循环中的数组,它正在改变索引。也许你想先复制收藏:
for (const child of [...children]) -
我刚刚测试过,工作,你能把它作为答案标记为正确答案。
-
CherryDT,我刚刚注意到,即使是空元素也会变得没有子元素,得到一个 -wrap-of- div。我知道这不是主要问题,但你如何解决这个问题?
标签: javascript for-loop wrapper children appendchild