我有一个包含17个值/选项的选择框。
<select id="_class" name="_class">
<option value="0"></option>
<option value="1">PREKG</option>
<option value="2">LKG</option>
<option value="3">UKG</option>
<option value="4">I</option>
<option value="5">II</option>
<option value="6">III</option>
<option value="7">IV</option>
<option value="8">V</option>
<option value="9">VI</option>
<option value="10">VII</option>
<option value="11">VIII</option>
<option value="12">IX</option>
<option value="13">X</option>
<option value="14">XI</option>
<option value="15">XII</option>
<option value="16">XIII</option>
</select>
现在,我正在尝试将选项从5移除到8.为此,我使用以下JavaScript代码。
<script type="text/javascript">
var _class = document.getElementById("_class");
for(var i=1; i < _class.length;i++) {
if(i>=5 && i<=8) {
_class.remove(i);
}
}
</script>
但是,我没有得到预期的结果,因为每次好像for循环运行时,选项的顺序都会发生变化。
如何获得所需的结果?
Here我附上了小提琴。
答案 0 :(得分:1)
通过逐步迭代选项,删除选项后,删除选项后选项的索引将减1(即:删除索引5处的选项会导致选项6及更高版本现在为索引为选项5及以上)。
为了满足这个要求,请颠倒循环的顺序以向下计数:
var _class = document.getElementById("_class");
for(var i=Math.min(_class.options.length, 8); i >= 5; i--) {
_class.remove(i);
}
答案 1 :(得分:1)
更简单的示例:删除6列表中的数字2到4: 在此列表中,数字代表数组中的INDEX:
现在,如果我删除数字2,其余项目将获得一个新索引:
如果我接下来删除3号,我实际上是为了:
有一个非常简单的技巧可以避免这种情况:按相反顺序删除: 在这个例子中(删除2到4)我们首先删除4:
删除四个后,只有四个以上的索引发生变化,并且 他们对我们无关紧要:
现在我们可以删除三个:
在编程术语中,这意味着转动for循环:
for(var i=8; i >= 5;i--) {
_class.remove(i);
}
请参阅http://jsfiddle.net/bjelline/XQH54/
P.S。正如你所看到的,我也将循环改为仅触摸 我们真正需要的索引。
答案 2 :(得分:0)
也许有点晚了,但我遇到了同样的问题。这是我的解决方案。 感谢@steveukx,你的解释帮助了我!
function remove(el) {
for(var i=el.length-1;i>=0;i--) {
if(el[i].selected)
el.remove(i);
}
};
答案 3 :(得分:0)
嗨,我遇到了同样的问题。我正在粘贴我的解决方案。 在fubbe回答这些是一些问题,如果用户试图发送更高的索引第一个和更低的索引随后..因此我正在调整传递的参数,以确保索引(通过参数接收)先按升序排序然后我们的循环将在反向删除索引。
HTMLSelectElement.prototype.removeIndexes = removeIndexes;
function removeIndexes(){
var res = Array.prototype.slice.call(arguments).sort(function(a, b){return a-b})
alert(res)
for (var i=res.length-1;i>=0;i--){
(function(self,indx){
self.remove(indx);
})(this,res[i])
}
}
var x = document.getElementById("mySelect");
x.removeIndexes(2,3)
//------- Another way----------------
HTMLSelectElement.prototype.removeIndexes = removeIndexes;
function removeIndexes(){
var self = this;
var res = Array.prototype.slice.call(arguments).sort(function(a, b) {return b-a}).map(function(indx){
alert(indx)
self.remove(indx);
})
}
var x = document.getElementById("mySelect");
x.removeIndexes(2,0,1)
希望这有帮助
亲切的问候 Gaurav Khurana