【问题标题】:How to toggle selection of an option in a multi-select with jQuery?如何使用 jQuery 在多选中切换选项的选择?
【发布时间】:2011-01-06 23:08:49
【问题描述】:

我有一个标准的select multiple HTML 输入字段,例如:

<select multiple="multiple" size="5" id="mysel" name="countries"> 
    <option value="2">Afghanistan</option> 
    <option value="4">Aland</option> 
</select>

由于这是一个多选,要选择多个值,您必须按住 CTRL 键并选择任何其他元素。但是我想要实现的是:

  1. 单击未选择的选项会选择它
  2. 单击已选择的选项会取消选择它。

这个想法是避免必须按 CTRL 键并更改此输入字段的使用语义。元素只能通过单击(即切换选择状态)来选择和不选择。

我还不能实现这个。伪代码应该是这样的。

  1. 捕捉点击事件。
  2. 检查被点击的元素是否未被选中,然后选择它
  3. 或者如果单击的元素被选中,则取消选中它。

我应该如何实现这个?

【问题讨论】:

    标签: jquery html select


    【解决方案1】:

    我来这里是为了解决我遇到的同样的问题。我修改了 user1106925 的解决方案,因为它不起作用(单击选择立即取消选择它)。 我的解决方案:

    onclick = "this.selected ? this.selected = !this.selected;"
    

    【讨论】:

      【解决方案2】:

      另一个没有 JQuery 的变体:

      var multiSelect = {};
      
      function init() {      
        var s = document.getElementsByTagName('select');
        for (var i = 0; i < s.length; i++) {
          if (s[i].multiple) {
            var n = s[i].name;
            multiSelect[n] = [];
            for (var j = 0; j < s[i].options.length; j++) {
              multiSelect[n][j] = s[i].options[j].selected;
            }
            s[i].onclick = changeMultiSelect;
          }
        }
      }
      
      function changeMultiSelect() {
        var n = this.name;
        for (var i=0; i < this.options.length; i++) {
          if (this.options[i].selected) {
            multiSelect[n][i] = !multiSelect[n][i];
          }
          this.options[i].selected = multiSelect[n][i];
        }
      }
      
      window.onload = init;
      

      【讨论】:

        【解决方案3】:

        你可以使用下面的sn-p来达到你想要的效果

        $("select[multiple] option").mousedown(function(){
           var $self = $(this);
        
           if ($self.prop("selected"))
                  $self.prop("selected", false);
           else
               $self.prop("selected", true);
        
           return false;
        });
        

        在旧版本的 jQuery 中,prop() 不可用:

        $("select[multiple] option").mousedown(function(){
           var $self = $(this);
        
           if ($self.attr("selected"))
                  $self.attr("selected", "");
           else
               $self.attr("selected", "selected");
        
           return false;
        });
        

        【讨论】:

        • 你好结核病,哦,谢谢一百万次!!!!伟大的!这就是我想要实现的!非常感谢!!
        • $self.prop('selected', !$self.prop('selected'));会更简洁。
        • @nilskp 也可以考虑$self.prop('selected', function(i,old){!old});
        • this.selected = !this.selected 更短更快。
        【解决方案4】:

        Javascript(不带 jquery):

        var select = document.getElementById('mysel');
        select.addEventListener('mousedown', function(e){
            var opt = e.target;
            if (opt.selected){
                opt.removeAttribute('selected');
                opt.selected = false;
            } else {
                opt.setAttribute('selected', '');
                opt.selected = true;
            }
            e.preventDefault();
        });
        

        我看到上面的大多数答案都是将事件与选项而不是选择绑定在一起。如果我的select有1000个选项,那么会绑定1000个事件,会不会影响性能?

        因此我也决定不在选项中绑定我的事件。

        【讨论】:

          【解决方案5】:

          我刚刚尝试了此解决方案,但所选答案不适用于 Jquery 1.9.1

          Oscar 的答案看起来好多了,但是它将属性与属性混合在一起,如果您选择、取消选择然后尝试再次选择,它将无法使用,因为它会将选择置于不可用状态

          我找到了正确的答案如下

          $("select[multiple] option").mousedown(function () {
                 if ($(this).prop("selected"))
                     $(this).prop("selected", false);
                 else
                     $(this).prop("selected", true);
                 return false;    });
          

          我希望这对其他人有帮助;)

          【讨论】:

          • 看起来接受的答案经过忍者编辑以复制您的答案,但我想我不知道以前是什么。
          • 至少有人喜欢我的解决方案足以复制我猜 ;) 遗憾的是问题的历史以及任何未来用户坚持使用 1.9.1 之前的 jQuery,感谢@PrinceTyke
          【解决方案6】:

          使用 jquery 1.9.1 的 javascript 代码是:

             $("select[multiple] option").mousedown(function () {
                 var $self = $(this);
                 if ($self.prop("selected"))
                     $self.removeAttr("selected");
                 else
                     $self.attr("selected", "selected");
                 return false;
             });
          

          【讨论】:

            【解决方案7】:

            新的 jQuery 版本可能会提供一些修复:

            $("select[multiple] option").mousedown(function(){
                var $self = $(this);
            
                if ($self.attr("selected")){
                    $self.removeAttr("selected");
                } else {
                    $self.attr("selected", "selected");
                }
                return false;
            });
            

            【讨论】:

              【解决方案8】:

              您想更改选择多个输入字段的默认行为是对的。它们往往会对用户体验产生负面影响,因为目的没有明确传达,用户可能不了解如何正确使用它们。

              重新调整多选框的用途也不正确。如果您正在考虑使用 select multiple,那么您可能需要重构您的设计。也许您可以使用复选框来代替?

              这是一篇关于该主题的文章:http://www.ryancramer.com/journal/entries/select_multiple/

              【讨论】:

              • 你好 2020vert。感谢您的快速答复。这很有趣,你指出的文章我已经读过(部分),因为我已经通过寻找解决我的问题的方法偶然发现了这篇文章。找到“切换”状态的解决方案会很棒。我认为这应该是可能的,但遗憾的是没有简单的方法来查询选择/取消选择状态......谢谢
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-03-08
              • 1970-01-01
              • 1970-01-01
              • 2012-07-07
              • 2011-03-07
              • 1970-01-01
              相关资源
              最近更新 更多