为什么这只是迭代 HTMLCollection 的奇怪元素
Why is this only iterating over odd elements of HTMLCollection?
当使用for...循环以迭代从 DOMParser 返回的 HTML 查询,仅返回奇数元素。我不认为这不是用 DOMParser 创建的 NodeList 或 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);
}
https://jsfiddle.net/8unbum1q/
https://jsfiddle.net/soq44eL2/
for (let element of doc.body.children) {
//document.body.appendChild(element);
console.log(element);
}
对代码进行此小调整 - 在控制台中,您将看到所有五个段落元素都以正确的顺序显示。
通过将元素附加到正文,可以将它们从doc
变量包含的文档中删除。
由于 HTMLCollection 根据定义是"实时的",这意味着它始终反映 DOM 的当前状态,因此您正在访问第一个元素并删除它(通过将其附加到正文(。所有元素向上移动一个位置,因此前第二个元素变为第一个,前第三个元素变为第二个元素,依此类推。现在,您的循环将移动到"下一个"元素,或者更准确地说,移动到列表中的下一个位置。即位置二,索引1,而目前占据该位置/索引的元素是前第三个元素,即包含数字3的段落。
在你的第二个小提琴中,不同的是你循环[...doc.body.children]
- 这是一个数组,作为开始时包含在 HTMLCollection 中的元素的静态一次性快照创建。因此,它不是活的,因此当元素附加到身体上时,它们不会从它身上消失,所以循环会覆盖所有这些元素。
相关文章:
- CKEditor Widget-阻止编辑可编辑元素本身
- 如何设置html元素填充的动画
- 如何将HTML id分配给元素,以及如何将JavaScript应用于元素
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 使用clickToggle并在单击另一个元素时关闭元素
- 单击时将焦点更改为元素
- 表追加而不附加最后一个元素
- 如何在jQuery中获取元素的形式
- 我可以获得相对于被点击元素的确切点击位置吗
- 在函数中添加数组元素的数值
- 在单击任何位置时隐藏元素,而不检查每次DOM单击
- 将视口底部滚动到元素底部
- 是否有任何snippet或jQuery插件可以列出easylist.txt模式匹配的DOM中的所有元素
- 在不使用JQuery的情况下隐藏DOM中的选定元素
- 如何使用jquery处理php循环通过元素
- Ckeditor-plugin:插入虚假元素add不情愿<p>标签前后
- JQuery添加元素需要在我的js之前再次添加JQuery脚本
- 在Jquery detachment()和appendTo()之后定位元素
- 在动态创建的元素上获取对特定选择器的引用
- 根据元素和容器大小计算边距