1

我有一个元素数组,我想在遍历数组时对每个元素使用 inserBefore。它应该在数组中的每个元素之后添加要插入的元素,但它只将它添加到数组中的最后一个元素。我认为这是一个闭包问题,但即使在使用闭包之后我仍然遇到问题。在没有闭包的情况下,我通过将类名更改为数组所在的键值来测试它,并且它改变了它没有问题。

for(var i in elems){
                    var refElem = elems[i];

                        refElem.parentNode.insertBefore(elementToInsert, refElem.nextSibling);
                }

这是减去闭包的代码。如何将 elementToInsert 添加到数组中的每个元素?

4

3 回答 3

4

它应该在每个元素之后添加要插入的元素

这就是问题出现的地方,您不能将一个元素多次插入 DOM。如果您尝试这样做,它只会在将元素插入某处(再次)之前从 DOM 中删除该元素。因此,您需要为循环的每一轮创建不同的元素,例如通过克隆您的elementToInsert.

顺便说一句,永远不要使用for...in-loops 和数组

于 2013-02-06T23:07:28.890 回答
2

就像 Bergi 所说,您插入的元素实际上是被添加然后从节点中删除的。

for(var i in elems){
    var refElem = elems[i];
    refElem.parentNode.insertBefore(elementToInsert.CloneNode(), refElem.nextSibling);
}

您还可以通知参数“deep”,它也将克隆所有子节点。

https://developer.mozilla.org/en-US/docs/DOM/Node.cloneNode

于 2013-02-06T23:22:34.353 回答
1

只是对之前的帖子进行了一点更正:

for(var i in elems){
    var refElem = elems[i];
    refElem.parentNode.insertBefore(elementToInsert.cloneNode(), refElem.nextSibling);
}

函数 cloneNode() 以小写字母开头。

于 2016-03-17T10:11:02.697 回答