$(document).on("click", ".select2-results__group", function(){
var input = $(this);
var location = input.html();
// Find the items with this location
var options = $('#select2 option');
$.each(options, function(key, value){
var name = $(value).html();
// The option contains the location, so mark it as selected
if(name.indexOf(location) >= 0){
$(value).prop("selected","selected");
}
});
$("#select2").trigger("change");
});
John S提供的示例在大多数情况下都能很好地工作(对于V3)。但是它有一个错误: 假设选择列表足够长,可以滚动。当您选择任何组中的任何项目时,只有在向下滚动后才可用-您不能再选择该组中所选项目之后的下一个项目。这是因为select 2的ensureHighlightVisible方法开始行为失常,因为它使用的选择器使用假设组总是“不可选”。因此,每次您尝试选择该项目时,滚动条都会跳转。 所以不幸的是,虽然这个解决方案看起来真的很好-我放弃了它,并重新实现了它,而不使用组ID:
// selection of the group.
function selectGroup(e) {
var $li = $(this);
e.preventDefault();
$select.select2('data', $select.select2('data').concat($li.data("select2Data").children));
$select.select2('close');
_this.$field.trigger('change');
}
// highlight of the group.
function highlight(e) {
if ($(e.target).hasClass("select2-result-unselectable") || $(e.target.parentNode).hasClass('select2-result-unselectable')) {
e.preventDefault();
e.stopPropagation();
$select.data("select2").dropdown.find(".select2-highlighted").removeClass("select2-highlighted");
$(this).addClass("select2-highlighted");
}
}
9条答案
按热度按时间7gyucuyw1#
如果使用隐藏的input元素(而不是select元素)支持Select 2,这是可能的。
要使组选项可选择,您必须给予一个“id”,但它似乎可以是一个空字符串。然后您可以使用“select 2-selecting”事件来防止组选项被选择,而是选择其子选项。
另外,可以提供
query
函数以防止组选项在其所有子选项已经被选择之后出现在列表中。如果你有这样定义的选项:
你可以像这样插入Select 2:
jsfiddle
下面是一个没有
query
函数的jsfiddle,当所有子选项都被选中时,组选项仍然显示。oknwwptz2#
我发现Select 2 v4的一个插件,它增加了点击optgroup来选择/取消选择所有子选项的功能。它对我来说非常有效。bnjmnhndrsn/select2-optgroup-select
谢谢本·亨德森!
332nm8kg3#
我使用过John的代码,但我的问题是我需要过滤的能力,所以我添加了它。
这是查询代码:
cpjpxq1n4#
首先给予id你的选择例如
<select style="width: 95%" id="selectgroup">
然后将类添加到您的optgroup,如
然后加上这个
如果你点击optgroup,它会选择optgroup下的所有选项。
o75abkj45#
好吧,我遇到了这个问题,我发现每次select 2(Select 2 4.0.5)打开时,它都会在关闭body元素之前添加一个span元素。此外,在span元素内添加一个id为的ul:select 2-X-results,其中X是select 2 id。所以我找到了以下解决方法(jsfiddle):
xzv2uavs6#
V4.0.2使用select元素的一个选项是:
JS + JQuery:
小提琴:https://jsfiddle.net/un1oL8w0/4/
zbwhf8kr7#
在Select 2 v4中,我发现John S的答案不起作用(see here)。我使用 AJAX 将数据作为数组加载,并创建了一个解决方案:
我按位置对我的项目进行分组,每个选项都在其html中的某个位置包含位置名称。每当单击optgroup标题时,我都会得到它的位置(下拉列表中显示的名称)。然后我查看#select2表中的所有选项,并找到哪些选项在其html中包含该位置。
我知道这是一个黑客的变通方法,但希望它有助于/指向正确的方向。
mnowg1ta8#
John S提供的示例在大多数情况下都能很好地工作(对于V3)。但是它有一个错误:
假设选择列表足够长,可以滚动。当您选择任何组中的任何项目时,只有在向下滚动后才可用-您不能再选择该组中所选项目之后的下一个项目。这是因为select 2的ensureHighlightVisible方法开始行为失常,因为它使用的选择器使用假设组总是“不可选”。因此,每次您尝试选择该项目时,滚动条都会跳转。
所以不幸的是,虽然这个解决方案看起来真的很好-我放弃了它,并重新实现了它,而不使用组ID:
和
ifmq2ha29#
您可以使用
templateResult
为组和子级添加特定行为。