繁体   English   中英

为什么这只遍历HTMLCollection的奇数元素?

[英]Why is this only iterating over odd elements of HTMLCollection?

当使用for ... of循环遍历从DOMParser返回的HTMLCollection时,仅返回奇数元素。 我不认为不是用DOMParser创建的NodeLists或HTMLCollections 不会发生这种情况。 如果将HTMLCollection转换为数组,也不会发生。

知道为什么会这样吗?

if (!HTMLCollection.prototype[Symbol.iterator]) {
    HTMLCollection.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];
}

let parser = new DOMParser();
let markup = '<p>Node 1</p><p>Node 2</p><p>Node 3</p><p>Node 4</p><p>Node 5</p>';
let doc = parser.parseFromString(markup, "text/html");
for (let element of doc.body.children) {
    document.body.appendChild(element);
}
for (let element of doc.body.children) {
    //document.body.appendChild(element);
    console.log(element);
}

稍微调整一下代码-在控制台中,您将看到按正确的顺序显示所有五个段落元素。

通过将元素追加到正文,您可以它们从doc变量所包含的文档中删除

而且,由于HTMLCollection在定义上是“活动的”,这意味着它始终反映DOM的当前状态,因此您正在访问第一个元素,并将其删除(通过将其附加到正文中)。所有元素都向上移动一个位置,因此以前的第二个变成第一,以前的第三个变成第二,依此类推。 现在,您的循环将移至“下一个”元素,或更确切地说,移至列表中的下一个位置 那就是第二个位置,索引1- 当前占据该位置/索引的元素是前一个第三元素,该段落包含数字3。


第二个小提琴的不同之处在于,您正在循环[...doc.body.children] -这是一个数组,该数组创建为HTMLCollection开头的元素的静态 ,一次性快照。 因此,它不是活的 ,因此当元素附加到身体上时元素不会从元素中消失,因此循环遍历了所有元素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM