我可能会找到其他解决方案来解决此问题,例如增加表单域的宽度或限制可以选择的项目数量。但是,您正在寻找的绝对是可能的。您可以收听select2:close event,它会在下拉菜单关闭后触发(即当您进行选择时)。
select2 在您的 <select> 元素旁边有一个兄弟元素,如下所示:
<span class="select2 ...">
其中包含一个无序列表,所有当前选定的选项都显示为单独的列表项。您可以获取所选项目的计数,然后修改无序列表以包含单个列表元素,显示所选选项的数量:
$('#mySelect2').on('select2:close', function() {
const $select = $(this);
const numSelected = $select.select2('data').length;
$select.next('span.select2').find('ul').html(function() {
return `<li class="class="select2-selection__choice">${numSelected} selected</li>`;
})
});
我添加了select2-selection__choice 类以匹配列表项通常具有的样式。此外,此列表仅用于显示目的,不会影响提交到您的表单的内容。
您可能需要的不仅仅是单个项目的关闭事件,因此最好创建一个可以在任何地方调用的通用函数。您甚至可以设置一个阈值,以便列表正常显示,除非所选项目的数量超过阈值:
function select2UpdateNumSelected(selector, threshold = 0) {
const $select = $(selector);
const numSelected = $select.select2('data').length;
// do nothing if the number of selections are at or below the threshold
if (numSelected <= threshold) {
return;
}
// display the number of selected items as a list item
$select.next('span.select2').find('ul').html(function() {
return `<li class="select2-selection__choice">${numSelected} selected</li>`;
});
}
例如,如果选择了 0、1 或 2 个项目,这将表现得像一个普通的 select2 实例,但一旦选择了 3 个或更多选项,显示将变为 3 selected:
$('#mySelect2').on('select2:close', function() {
select2UpdateNumSelected($(this), 2);
});
最后一点。如果您在加载页面时预先填充您的选择,它不会自动转换为 X selected 消息,除非您还在页面加载时调用该函数:
select2UpdateNumSelected('#mySelect2', 2);