使用“for..of”循环从Vanilla JavaScript中的Select标记中删除选项
当尝试从select中删除选项时,总是会有一个选项剩余,为什么使用“for..of”循环从Vanilla JavaScript中的Select标记中删除选项,javascript,Javascript,当尝试从select中删除选项时,总是会有一个选项剩余,为什么 <select id="form-select"> <option>111</option> <option>222</option> <option>333</option> </select> 这也不起作用: for(var i of document.querySelector('#form-select').options
<select id="form-select">
<option>111</option>
<option>222</option>
<option>333</option>
</select>
这也不起作用:
for(var i of document.querySelector('#form-select').options) {
i.remove()
}
我知道还有其他解决方案可以实现这一点,但我想了解为什么它没有按预期的那样工作。选项集合不幸处于活动状态,因此逐个迭代活动集合的项,并删除每个项将导致保留每个奇数项。例如,当您删除第一项时,集合的第[0]项将立即成为集合中的下一项-以前的[1]将变成[0],然后一旦转到[1]处的下一个索引,位置0处的新项将不会被迭代
改为使用document.querySelectorAll,它返回一个静态集合:
用于文档的const选项。queryselector调用'form-select>option'{
选项。删除;
}
111
222
333
在遍历数组时,您正在从数组中删除项。所以你有: [一,二,三] 然后删除索引0处的项,该项为1,留下: [二,三] 接下来,删除索引1中的项目,即3,剩下: [二] 索引2中没有项,因此循环停止 以相反的方式迭代数组: const t=document.querySelectorform-select 对于let i=t.options.length-1;i>=0;我-{ t、 删除Childt.选项[i] } 111 222 333
我知道您的主要目标是了解导致这种情况发生的过程,因此这应该为您说明问题: var arr=[1,2,3,4,5,6]; forvar i=0;i
var selectOptions = document.querySelectorAll('#remove-option>option');
selectOptions.forEach(function(selectOption) {
selectOption.remove();
selectOption = null;
});
这里是the.options不是一个数组,这是问题的根源,而是一个动态的HTMLCollection。如果它是一个数组,它将是静态的,不会有任何问题。@CertainPerformance在遍历数组时从数组中删除元素确实会导致我所说明的问题。@CertainPerformance HTMLOptionsCollection对象在此上下文中的行为与数组类似。
var selectOptions = document.querySelectorAll('#remove-option>option');
selectOptions.forEach(function(selectOption) {
selectOption.remove();
selectOption = null;
});