如何动态地将选项添加到 Bootstrap 选择器?

Posted

技术标签:

【中文标题】如何动态地将选项添加到 Bootstrap 选择器?【英文标题】:How can I add options to a Bootstrap selectpicker dynamically? 【发布时间】:2021-02-19 14:58:09 【问题描述】:

我正在尝试创建一个下拉列表,当单击第一个列表项时,会在列表旁边打开一个与所选项目相关的新列表,如下所示:

我尝试为此使用 Bootstrap selectpicker,然后单击尝试将另一个列表添加为:

<select class="selectpicker" data-live-search="true">
            <optgroup label="Select Group 1">
                <option value="1">Option 1.1</option>
                <option value="2">Option 1.2</option>
                <option value="3">Option 1.3</option>
            </optgroup>
            
        </select>

并在 jquery 中单击尝试附加和刷新选择器。

       $(event.target)
           .append("<optgroup label="Select Group 2">
                <option value="4">Option 2.1</option>
                <option value="5">Option 2.2</option>
                <option value="6">Option 2.3</option>
            </optgroup>");
       $(dropdowmElem).selectpicker("refresh");

但我不确定如何实现类似的布局。我不是在寻找类似的 CSS 样式,而是在现有列表旁边呈现另一个列表,有什么帮助/资源来解决这个问题吗?

【问题讨论】:

第一级“选择区域”对我来说是垂直标签。如果所有国家/地区都是事先知道的,为什么需要在用户选择区域后动态“添加”另一个列表? 我得到了大约 50 种不同的层次结构树,并希望延迟加载每棵树以更快地渲染,而不是一次性转储所有数据。 看看这个问题在那里解决了:***.com/questions/37756959/… 澄清您的要求的问题: 1) 您的屏幕截图显示您可以在组 1 中选择多个。如果是这样,新的组项目列表将如何工作?选择选项 1.2 会在右侧生成一个新列表,选择选项 1.3 会覆盖 1.2 生成的新列表? 2)您的屏幕截图显示第 1 组项目也是有效的选择,并且确实被选中。第 1 组中的项目是否作为右侧列表的“全选”? Group 2 将是一个列表,它附加了所有 Group 1 选择项的子元素。选择 1.2 和 1.3 将在 Group 2 列表下有 1.2 相关子元素(2.1, 2.2)加上 1.3 相关元素(2.3),添加一个 optgroup 来区分也会有帮助。如果还需要任何信息,请告诉我。 【参考方案1】:

这可能不起作用的一个原因是您可以在双引号中使用双引号或在多行中使用双引号。尝试改用这个:

$(event.target)
    .append(`<optgroup label="Select Group 2">
         <option value="4">Option 2.1</option>
         <option value="5">Option 2.2</option>
         <option value="6">Option 2.3</option>
     </optgroup>`);
$(dropdowmElem).selectpicker("refresh");

您也无法检测到&lt;option&gt; 上的鼠标悬停。您可以检测到:hover,以防万一您想以某种方式将两者链接在一起。如果此功能无法按您希望的方式工作,您也可以创建自己的菜单类型。

【讨论】:

【参考方案2】:

为什么不在多级下拉菜单中实现这一点

$(document).ready(function()
  $('.dropdown-submenu a.test').on("click", function(e)
    $(this).next('ul').toggle();
    e.stopPropagation();
    e.preventDefault();
  );
);
.dropdown-submenu 
  position: relative;


.dropdown-submenu .dropdown-menu 
  top: 0;
  left: 100%;
  margin-top: -1px;
<!DOCTYPE html>
<html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<style>

</style>
</head>
<body>
   
<div class="container">
  <h2>Multi-Level Dropdowns</h2>
                                        
  <div class="dropdown">
    <button class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown">Tutorials
    <span class="caret"></span></button>
    <ul class="dropdown-menu">
      <li><a tabindex="-1" href="#">HTML</a></li>
      <li><a tabindex="-1" href="#">CSS</a></li>
      <li class="dropdown-submenu">
        <a class="test" tabindex="-1" href="#">New dropdown <span class="caret"></span></a>
        <ul class="dropdown-menu">
          <li><a tabindex="-1" href="#">2nd level dropdown</a></li>
          <li><a tabindex="-1" href="#">2nd level dropdown</a></li>
          <li class="dropdown-submenu">
            <a class="test" href="#">Another dropdown <span class="caret"></span></a>
            <ul class="dropdown-menu">
              <li><a href="#">3rd level dropdown</a></li>
              <li><a href="#">3rd level dropdown</a></li>
            </ul>
          </li>
        </ul>
      </li>
    </ul>
  </div>
</div>

<script>

</script>

</body>
</html>

将菜单项替换为optgroup

【讨论】:

以上是关于如何动态地将选项添加到 Bootstrap 选择器?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据从 ajax 调用返回的数据动态地将选项添加到我的自动完成功能?

使用装饰器动态地将方法添加到类中

动态重新初始化或销毁 Bootstrap 日期选择器

设计决策:动态添加数据问题

在 AsyncTask 中动态地将项目添加到微调器

如何动态地将 id 传递给 Bootstrap 验证器规则的 url:远程用于相同的表单输入字段?