javascript - Javascript removeChild 没有删除循环内的所有元素
问题描述
我想做什么-
- 通过javascript从DOM中获取特定类的所有元素
- 从元素的父元素获取
img
元素 img
在父元素之前插入元素- 移除父元素
这是代码:
let elms = el.getElementsByClassName("my-class");
console.log(elms) // 6 elements are printed here
for (let elm of elms) {
console.log("Inside loop") //only printed 3 times
let elm_parent = elm.parentNode;
let img_elm = elm_parent.getElementsByTagName("img");
elm.parentNode.parentNode.insertBefore(img_elm[0], elm_parent);
elm.parentNode.parentNode.removeChild(elm_parent);
}
//Loop only executes 3 times
这是 HTML 的结构(总共有 6 个这样的元素):
<p>
<div style="position: relative; display: block;">
<img src="http://something.com/image1" style="display: block;">
<div></div><svg class="my-class" viewBox="0 0 341 102">
<g>
<g class="a9s-selection" style="pointer-events: none;">
<rect class="outer" x="-1.5" y="58" width="147" height="40"></rect>
<rect class="inner" x="-1.5" y="58" width="147" height="40"></rect>
</g>
</g>
</svg>
</div>
<br>
</p>
如您所见,虽然elms
有 6 个元素,但循环只执行了 3 次。谁能帮我理解为什么会这样?
解决方案
问题:通过引用对象调用。
当你这样做时el.getElementsByClassName("my-class");
,它会给你一个HTMLCollection
看起来像一个数组的活动对象。由 DOM 本身处理。如果你从 DOM 中删除任何存在于HTMLCollection
长度中的东西,它HTMLCollection
也会减少。
HTMLCollection
解决方案:以数组的形式创建一个副本。
let elms = el.getElementsByClassName("my-class");
elms = Array.from(elms);
推荐阅读
- javascript - "$lookup with 'pipeline' 可能没有指定 'localField' 或 'foreignField'"
- c++ - 移动持有 unique_ptr 的类实例
- amazon-web-services - 使用 tag::eventtype 动态生成的列在 splunk 中具有标题 null
- ubuntu-20.04 - Symfony:在 Linux Ubuntu 上生成实体时路径错误
- ruby - 如何避免 ruby 类中的层次结构?
- node.js - 全球支付集成:- 我们可以从保存的卡参考 (PMT_REF) 和 PAYER_REF 收取一次性付款吗
- kotlin - Kotlin - 如何增加 mutableMap 的价值
- excel - 您如何编写 VBA 代码以根据单元格填充颜色更改字体颜色
- python - 无法计算使用 string.split 创建的列中的元素,该列应该是一个列表
- python - BeautifulSoup - 链接名称