Select2 从过滤列表中选择所有选项以进行多项选择

Posted

技术标签:

【中文标题】Select2 从过滤列表中选择所有选项以进行多项选择【英文标题】:Select2 choosing all options from filtered list for multiple selection 【发布时间】:2020-07-07 10:19:01 【问题描述】:

在我的选择下拉列表中使用 jQuery 的 select2 插件可以让我快速键入和查找部分匹配项。但是,如果我想获取所有部分匹配项,我必须单击一个,再次键入过滤器,单击下一个,等等。它很快就会变得乏味。相反,我想做的是输入前几个字符,然后选择所有 FILTERED 选项。

例如,如果我有一份美国每个州的列表,然后输入“New”,我会看到“New Hampshire, New Jersey, New Mexico, New York”。我想要一种方法来选择所有 4 个,而不必单击每个。

这是一个 jsfiddle 示例:https://jsfiddle.net/myingling/xv7bzqek/4/

<select name='state' id='state' multiple='multiple'>
                    <option value='null'> - Please Select - </option>
                    <option value='AL'>Alabama</option>
                    <option value='AK'>Alaska</option>
                    <option value='AZ'>Arizona</option>
                    <option value='AR'>Arkansas</option>
                    <option value='CA'>California</option>
                    <option value='CO'>Colorado</option>
                    <option value='CT'>Connecticut</option>
                    <option value='DE'>Delaware</option>
                    <option value='DC'>District Of Columbia</option>
                    <option value='FL'>Florida</option>
                    <option value='GA'>Georgia</option>
                    <option value='HI'>Hawaii</option>
                    <option value='ID'>Idaho</option>
                    <option value='IL'>Illinois</option>
                    <option value='IN'>Indiana</option>
                    <option value='IA'>Iowa</option>
                    <option value='KS'>Kansas</option>
                    <option value='KY'>Kentucky</option>
                    <option value='LA'>Louisiana</option>
                    <option value='ME'>Maine</option>
                    <option value='MD'>Maryland</option>
                    <option value='MA'>Massachusetts</option>
                    <option value='MI'>Michigan</option>
                    <option value='MN'>Minnesota</option>
                    <option value='MS'>Mississippi</option>
                    <option value='MO'>Missouri</option>
                    <option value='MT'>Montana</option>
                    <option value='NE'>Nebraska</option>
                    <option value='NV'>Nevada</option>
                    <option value='NH'>New Hampshire</option>
                    <option value='NJ'>New Jersey</option>
                    <option value='NM'>New Mexico</option>
                    <option value='NY'>New York</option>
                    <option value='NC'>North Carolina</option>
                    <option value='ND'>North Dakota</option>
                    <option value='OH'>Ohio</option>
                    <option value='OK'>Oklahoma</option>
                    <option value='OR'>Oregon</option>
                    <option value='PA'>Pennsylvania</option>
                    <option value='PR'>Puerto Rico</option>
                    <option value='RI'>Rhode Island</option>
                    <option value='SC'>South Carolina</option>
                    <option value='SD'>South Dakota</option>
                    <option value='TN'>Tennessee</option>
                    <option value='TX'>Texas</option>
                    <option value='UT'>Utah</option>
                    <option value='VT'>Vermont</option>
                    <option value='VA'>Virginia</option>
                    <option value='WA'>Washington</option>
                    <option value='WV'>West Virginia</option>
                    <option value='WI'>Wisconsin</option>
                    <option value='WY'>Wyoming</option>
</select>
<input type='button' id='all_visible' value='Select Visible' />
<script>
    jQuery('#state').select2();

    jQuery('#all_visible').click(function() 
         var visible = null; // TODO: how do we grab the filtered list?
         jQuery('#state').val(visible).trigger('change');
    );
</script>

有没有办法做到这一点? select2 文档显示了如何以编程方式选择 SINGLE 选项,而不是从他们自己的过滤列表中选择。选择所有选项还有很多其他答案,但其中包括那些被过滤器隐藏的选项(例如:加利福尼亚)。

模拟样例:

【问题讨论】:

你打算在这里使用什么(UX)?当您单击 Select2 外部的按钮时 - select2 将自动关闭,因为它失去焦点。 可以为 select2 元素本身添加一个按钮吗?现实世界的用例是某人有一个帐户列表,其中许多属于同一家公司(例如:“Acme Software”、“Acme Shipping”、“Acme Logicistics”)。而不是让他们输入“Acme”3 次并单击每个,过滤到 3 个 Acme 业务(就像输入 select2 所做的那样),然后单击一个按钮来选择所有可见项目。 模拟示例:i.snipboard.io/BGIsMp.jpg 【参考方案1】:

我尝试从选择下拉列表中获取过滤后的可见值。 select2 插件将所有插件数据存储在 data() 对象中。您可以在此处查看 $("#select").data() 的结果。

您所要做的就是遍历数据对象中过滤的结果元素(li tag),并为所有这些结果元素触发mouseup事件。

试试下面的工作示例。

<html>

<head>
   
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  
    
    <script type="text/javascript"
        src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.10/js/select2.min.js"></script>
    <link rel="stylesheet" type="text/css"
        href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.10/css/select2.min.css">

    <style id="compiled-css" type="text/css">

    </style>

    <script>
        $(document).ready(function() 
            $('#state').select2();
            
            $('#all_visible').click(function(event) 
            event.preventDefault();
            var visible = null; // TODO: how do we grab the filtered list?
             //   $('#state').val(visible).trigger('change');

                // Get the data object of state dropdown
                var filteredValues = [];
                var select2Holder = $('#state').data(); 

                if (select2Holder && select2Holder.select2) 
                    // Find the $results object
                    var results = select2Holder.select2.$results;
                    if (results) 
                      //  var resultNode$ = $(results[0]);
                      //  console.log(resultNode$);
                        
                        if ($(results[0]) && $(results[0]).children().length > 0) 
                            $(results[0]).children().each(function(index, node) 
                               
                                var selectedValue;
                                // Get the option value from attribute
                                var id = $(node).attr('id');
                                // id attribute will be like this 'select2-state-result-x3b0-NH'
                                // split the id attribute using "-" and get last value
                                var arr  = id.split('-');
                                if (arr && arr.length > 0) 
                                  selectedValue = arr[arr.length -1 ];
                                  filteredValues.push(selectedValue);
                                

                                $(node).trigger('mouseup');
                              
                            )
                          
                        
                        
                    

                
            );
        )
    </script>

  
</head>

<body >
    <select name='state' id='state' multiple='multiple'>
        <option value='null'> - Please Select - </option>
        <option value='AL'>Alabama</option>
        <option value='AK'>Alaska</option>
        <option value='AZ'>Arizona</option>
        <option value='AR'>Arkansas</option>
        <option value='CA'>California</option>
        <option value='CO'>Colorado</option>
        <option value='CT'>Connecticut</option>
        <option value='DE'>Delaware</option>
        <option value='DC'>District Of Columbia</option>
        <option value='FL'>Florida</option>
        <option value='GA'>Georgia</option>
        <option value='HI'>Hawaii</option>
        <option value='ID'>Idaho</option>
        <option value='IL'>Illinois</option>
        <option value='IN'>Indiana</option>
        <option value='IA'>Iowa</option>
        <option value='KS'>Kansas</option>
        <option value='KY'>Kentucky</option>
        <option value='LA'>Louisiana</option>
        <option value='ME'>Maine</option>
        <option value='MD'>Maryland</option>
        <option value='MA'>Massachusetts</option>
        <option value='MI'>Michigan</option>
        <option value='MN'>Minnesota</option>
        <option value='MS'>Mississippi</option>
        <option value='MO'>Missouri</option>
        <option value='MT'>Montana</option>
        <option value='NE'>Nebraska</option>
        <option value='NV'>Nevada</option>
        <option value='NH'>New Hampshire</option>
        <option value='NJ'>New Jersey</option>
        <option value='NM'>New Mexico</option>
        <option value='NY'>New York</option>
        <option value='NC'>North Carolina</option>
        <option value='ND'>North Dakota</option>
        <option value='OH'>Ohio</option>
        <option value='OK'>Oklahoma</option>
        <option value='OR'>Oregon</option>
        <option value='PA'>Pennsylvania</option>
        <option value='PR'>Puerto Rico</option>
        <option value='RI'>Rhode Island</option>
        <option value='SC'>South Carolina</option>
        <option value='SD'>South Dakota</option>
        <option value='TN'>Tennessee</option>
        <option value='TX'>Texas</option>
        <option value='UT'>Utah</option>
        <option value='VT'>Vermont</option>
        <option value='VA'>Virginia</option>
        <option value='WA'>Washington</option>
        <option value='WV'>West Virginia</option>
        <option value='WI'>Wisconsin</option>
        <option value='WY'>Wyoming</option>
</select>
<input type='button' id='all_visible' value='Select Visible' />
</body>

</html>

【讨论】:

完美,谢谢!赏金不需要(我将在此评论后立即授予它),因为我看到这个作品,但我在 JSFiddle 中遇到了麻烦......任何线索为什么? jsfiddle.net/myingling/3z6mecq9/2 我对代码做了一些修改。不知道为什么它会在小提琴中引发克隆错误。在 fiddle 检查我更新的代码。 jsfiddle.net/prathameshk73/pvLex31d/14我已经评论了resultNode$

以上是关于Select2 从过滤列表中选择所有选项以进行多项选择的主要内容,如果未能解决你的问题,请参考以下文章

使用多项选择 select2 选择后立即显示选择的选项数量

如何从select2多选中的选项列表中删除选定的选项并按选择的顺序显示选定的选项

无法使用 Select2 以编程方式选择选项

如何从外部列表框中控制 select2 选择框?

在与下拉列表分开的输入中显示 select2“药盒”

Select2 - 在选择时,从下一个选择元素中删除禁用的属性