Select2 从筛选列表中选择所有选项以进行多项选择
Select2 choosing all options from filtered list for multiple selection
在我的 select 下拉菜单中使用 jQuery 的 select2 插件允许我快速输入和查找部分匹配项。但是,如果我想获取所有部分匹配项,我必须单击一个,再次键入过滤器,单击下一个,等等。很快就会变得乏味。相反,我想做的是输入前几个字符,然后输入 select 所有 FILTERED 选项。
例如,如果我有美国每个州的列表,然后输入 "New",我会看到 "New Hampshire, New Jersey, New Mexico, New York"。我想要一种方法来 select 所有 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 文档展示了如何以编程方式 select 一个单一选项,而不是从他们自己的过滤列表中集中。 selecting ALL选项还有很多其他答案,但这将包括被过滤器隐藏的那些(例如:加利福尼亚)。
模拟样本:
我尝试从 select 下拉列表中获取筛选后的可见值。 select2插件将所有插件数据存储在data()对象中。在这里你可以得到 $("#select").data().
的结果
你所要做的就是遍历数据对象中过滤后的结果元素(li标签)并触发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>
在我的 select 下拉菜单中使用 jQuery 的 select2 插件允许我快速输入和查找部分匹配项。但是,如果我想获取所有部分匹配项,我必须单击一个,再次键入过滤器,单击下一个,等等。很快就会变得乏味。相反,我想做的是输入前几个字符,然后输入 select 所有 FILTERED 选项。
例如,如果我有美国每个州的列表,然后输入 "New",我会看到 "New Hampshire, New Jersey, New Mexico, New York"。我想要一种方法来 select 所有 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 文档展示了如何以编程方式 select 一个单一选项,而不是从他们自己的过滤列表中集中。 selecting ALL选项还有很多其他答案,但这将包括被过滤器隐藏的那些(例如:加利福尼亚)。
模拟样本:
我尝试从 select 下拉列表中获取筛选后的可见值。 select2插件将所有插件数据存储在data()对象中。在这里你可以得到 $("#select").data().
的结果你所要做的就是遍历数据对象中过滤后的结果元素(li标签)并触发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>