javascript - 使用 select2 折叠/展开 optgroup

标签 javascript jquery css jquery-select2

我正在尝试使用 Select2 jquery 插件使我的选择下拉菜单中的 optgroups 可折叠/可展开。

我发现了一个看起来不错且直接的解决方案 (https://github.com/select2/select2/issues/730),但它对我不起作用,我认为这是因为它来自旧版本的 select2。

我已经想出了如何更新

的 css
.select2-result-sub > li.select2-result {
    display: none;
}

#select-container .select2-results__options--nested > li.select2-results__option {
    display: none;
}

(我还根据 How to override .select2-results .select2-highlighted color 将我的选择对象放入容器中)

但我不知道如何更新所需的 javascript:

$('.select2-results').on('click', 'li', function(){
    $(this).find('li').show();
});

在我看来,我只需要将 select2-results 替换为 select2-results__optionsselect2-results__option,但我'我尝试了很多方法,使用和不使用容器,但我就是无法让它工作。我在 javascript/jquery 方面没有太多经验,所以我真的不明白我在尝试选择 optgroup 元素时做错了什么。

此外,这是我的 html:

<div id="select-container">
    <select id="select-test" multiple="multiple" style="width:300px">
            <optgroup label="Group 1">
                <option value="1">Option 1</option>
                <option value="2">Option 2</option>
                <option value="3">Option 3</option>
            </optgroup>
            <optgroup label="Group 2">    
                <option value="4">Option 4</option>
                <option value="5">Option 5</option>
                <option value="6">Option 6</option>
            </optgroup>
     </select>     
 </div>  

感谢任何帮助,谢谢!!

最佳答案

这是一个简单的演示。

$("#select-test").select2();
$("body").on('click', '.select2-results__group', function() {
  $(this).siblings().toggle();
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.5/js/select2.full.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.5/css/select2.min.css" />
<div id="select-container">
  <select id="select-test" multiple="multiple" style="width:300px">
    <optgroup label="Group 1">
      <option value="1">Option 1</option>
      <option value="2">Option 2</option>
      <option value="3">Option 3</option>
    </optgroup>
    <optgroup label="Group 2">
      <option value="4">Option 4</option>
      <option value="5">Option 5</option>
      <option value="6">Option 6</option>
    </optgroup>
  </select>
</div>

编辑:

我们可以使用 select2:open 事件启动折叠的 optgroup。我添加了一个对象来记录每个 optgroup 的折叠状态。

opacity 设置为 0,并在确定每个 optgroup 的折叠状态后将其设置回 1

请注意,select2:open.select2-results__group 创建之前触发,因此我使用 setTimeout 等待几毫秒。

$("#select-test").select2();

let optgroupState = {};

$("body").on('click', '.select2-container--open .select2-results__group', function() {
  $(this).siblings().toggle();
  let id = $(this).closest('.select2-results__options').attr('id');
  let index = $('.select2-results__group').index(this);
  optgroupState[id][index] = !optgroupState[id][index];
})

$('#select-test').on('select2:open', function() {
  $('.select2-dropdown--below').css('opacity', 0);
  setTimeout(() => {
    let groups = $('.select2-container--open .select2-results__group');
    let id = $('.select2-results__options').attr('id');
    if (!optgroupState[id]) {
      optgroupState[id] = {};
    }
    $.each(groups, (index, v) => {
      optgroupState[id][index] = optgroupState[id][index] || false;
      optgroupState[id][index] ? $(v).siblings().show() : $(v).siblings().hide();
    })
    $('.select2-dropdown--below').css('opacity', 1);
  }, 0);
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.5/js/select2.full.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.5/css/select2.min.css" />
<div id="select-container">
  <select id="select-test" multiple="multiple" style="width:300px">
    <optgroup label="Group 1">
      <option value="1">Option 1</option>
      <option value="2">Option 2</option>
      <option value="3">Option 3</option>
    </optgroup>
    <optgroup label="Group 2">
      <option value="4">Option 4</option>
      <option value="5">Option 5</option>
      <option value="6">Option 6</option>
    </optgroup>
  </select>
</div>

关于javascript - 使用 select2 折叠/展开 optgroup,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52156973/

相关文章:

c# - 从 web 服务创建 JSON 返回 "strings"以与 jquery ajax 一起使用

jquery Ajax从 View 到 Controller 方法调用,但不显示在mvc中返回该方法的 View

css - chrome 不显示样式的 css 源文件名

javascript - 如何固定标题和侧边栏?

html - 覆盖现有库的 CSS

javascript - 使用 XhrIo 填充 Object 的变量

javascript - Nightmare 无法解决阿迪达斯网站

javascript - Angular 7通过调用两次服务订阅方法进行通信

php - 如何通过 JQuery Post 传递 Javascript 数组,以便通过 PHP $_POST 数组访问其所有内容?

javascript - 如果输入值满足要求则添加html属性