【发布时间】:2012-11-01 04:29:45
【问题描述】:
我发誓这几天前还运行良好...
elm = document.querySelectorAll(selector);
var frag = document.createDocumentFragment();
while (elm[0]){
frag.appendChild(elm[0]);
}
对,所以,这应该从我们的elm 节点列表中附加每个节点。当第一个被附加时,第二个“移动”到节点列表中的第一个位置,因此下一个总是elm[0]。当elm nodeList 完全附加时,它应该停止。但是,这给了我一个无限循环。想法?
编辑 - 因为我多次得到相同的答案...
nodeList 不是数组,它是实时引用。当一个节点被“移动”(此处为附加)时,它应该自动从节点列表中删除。答案都说“你一遍又一遍地附加相同的元素” - 这就是正在发生的事情,它不应该。 for 循环不应该工作,因为当第一个节点被追加时,下一个节点会使用它的索引。
第二次编辑
所以现在的问题是“为什么nodeList 表现得像一个数组?”。每次在某处追加节点时,节点列表应该更新。最奇特的。
解决方案(以防有人需要处理实时+非实时节点列表)
elm = (/*however you're getting a node list*/);
var frag = document.createDocumentFragment();
var elength = elm.length;
for (var b = 0; b<elength; b++){
if (elm.length === elength){
frag.appendChild(elm[b]);
} else {
frag.appendChild(elm[0].cloneNode());
}
}
基本上,只是检查节点列表是否改变了长度。
【问题讨论】:
-
您在任何时候都不要修改
elm节点列表,这意味着while 循环将继续追加列表中的第一个元素。 -
我认为这里的主要问题是 JavaScript 不是 C。如果我没记错的话,数组不是就地修改的,而是复制的。
-
所以现在的问题是“为什么 nodeList 表现得像一个数组?”。每次将节点附加到某个地方时,节点列表都应该更新。最奇特的。 谁教你的?这不是现场直播。请参阅下面我编辑的帖子,其中包含指向文档的链接。
-
@epascarello developer.mozilla.org/en-US/docs/DOM/NodeList 过去每次我使用节点列表。
-
仅供参考,这是完全相反的问题,可以说是infinite-loop via prepend element in DOM,其中 live 列表导致了无限循环。
标签: javascript while-loop infinite-loop appendchild