【发布时间】:2013-03-28 10:31:11
【问题描述】:
我是 Javascript 初学者。
我正在通过window.onload 启动网页,我必须通过它们的类名 (slide) 找到一堆元素,并根据某些逻辑将它们重新分配到不同的节点中。我有函数Distribute(element),它将一个元素作为输入并进行分配。我想做这样的事情(例如here 或here):
var slides = getElementsByClassName("slide");
for(var i = 0; i < slides.length; i++)
{
Distribute(slides[i]);
}
然而这对我来说并没有什么魔力,因为getElementsByClassName实际上并没有返回数组,而是一个NodeList,也就是......
...这是我的猜测...
...在函数Distribute 内被改变(DOM 树在这个函数内被改变,并且某些节点的克隆发生)。 For-each 循环结构也无济于事。
可变幻灯片的行为确实是不确定的,通过每次迭代它都会疯狂地改变它的长度和元素的顺序。
在我的情况下,迭代 NodeList 的正确方法是什么?我正在考虑填充一些临时数组,但不知道该怎么做......
编辑:
我忘记提到的重要事实是,可能有一张幻灯片在另一张幻灯片中,这实际上改变了slides 变量,因为我刚刚发现感谢用户Alohci。
我的解决方案是先将每个元素克隆到一个数组中,然后将数组逐个传递给Distribute()。
【问题讨论】:
-
这实际上是这样做的,所以你一定是在搞砸别的东西!
-
Distribute()函数要复制到这里很长而且很复杂,但我确信我正在改变里面的 DOM 结构,我也在那里复制(克隆)元素。调试的时候可以看到变量slides每次传入里面都会发生变化。 -
它不会改变,除非你真的在某个地方改变它。
-
我相信
getElementsByClassName()会返回一个实时的nodeList,因此在添加具有该类的元素时,您正在迭代更改的nodeList的长度。 -
@Kupto- 反向循环通常可以解决此类问题,其中 Distribute 函数删除或移动元素,使其不再匹配 getElementsByClassName 调用,原因是 David Thomas 给出的。跨度>
标签: javascript html dom