删除多个选项时选择选项remove()方法

时间:2013-01-19 08:00:14

标签: javascript

我有一个包含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我附上了小提琴。

4 个答案:

答案 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);
}

http://jsfiddle.net/Gy8j8/2/

答案 1 :(得分:1)

更简单的示例:删除6列表中的数字2到4: 在此列表中,数字代表数组中的INDEX:

  • 1)一个
  • 2)两个
  • 3)三
  • 4)四
  • 5)五
  • 6)六

现在,如果我删除数字2,其余项目将获得一个新索引:

  • 1)一个
  • 2)三
  • 3)四
  • 4)五
  • 5)六

如果我接下来删除3号,我实际上是为了:

  • 1)一个
  • 2)三
  • 3)五
  • 4)六

有一个非常简单的技巧可以避免这种情况:按相反顺序删除: 在这个例子中(删除2到4)我们首先删除4:

  • 1)一个
  • 2)两个
  • 3)三
  • 4)四
  • 5)五
  • 6)六

删除四个后,只有四个以上的索引发生变化,并且 他们对我们无关紧要:

  • 1)一个
  • 2)两个
  • 3)三
  • 4)五
  • 5)六

现在我们可以删除三个:

  • 1)一个
  • 2)两个
  • 3)五
  • 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