【问题标题】:Load Bootstrap-Multiselect based on optgroup using jquery使用 jquery 基于 optgroup 加载 Bootstrap-Multiselect
【发布时间】:2020-04-30 03:29:16
【问题描述】:

我正在使用Bootstrap-select,如下所示:

 <label for="name">CARS</label>
    <select multiple title="Cars" class="selectpicker cars" id="cars">
      <optgroup label="Car">
        <option>Benz</option>
        <option>BMW</option>
        <option>Volvo</option>
        <option>Hyundai</option>
      </optgroup>
      <optgroup label="Bike">
        <option>Benz</option>
        <option>BMW</option>
        <option>Volvo</option>
        <option>Hyundai</option>
      </optgroup>
      <optgroup label="Bicycle">
        <option>Benz</option>
        <option>BMW</option>
        <option>Volvo</option>
        <option>Hyundai</option>
      </optgroup>
    </select>

我想根据 Ajax 调用加载它(选择选项)。我知道如何使用 Ajax 调用,但我不知道如何基于 optgroup 填充多选(选择选项)。因为如你所见,它在不同的 optgropus 中具有相同的选项。

更新

$(document).on('click', '.ModalButton', function(ev){ 
    ev.preventDefault();
    var url = $(this).data("form"); 
    var company_name = $(this).data('target');
    $(".Modal").unbind().load(url, function() { 
        $.ajax({
            type: "GET",
            url: "/app/edit/",
            data: {
                company_name: company_name,
                csrfmiddlewaretoken: document.getElementsByName('csrfmiddlewaretoken')[0].value
            },
            success: function(data) {
                <<<<<< Multiselect Populating Code should be placed here >>>>>>>>
            }
        });
        $(this).modal('show');
    });
    return false;
});

Ajax 响应将是:

Car: Benz, Car: BMW, Bike: Benz, Bicycle: Volvo

【问题讨论】:

  • 致您的更新:ajax 响应是纯字符串还是 json 响应?你能说得更具体一点吗?
  • 这是一个json响应

标签: jquery bootstrap-4 multi-select bootstrap-multiselect


【解决方案1】:

您的问题的片段

在您最后评论重要细节后,您只需在 success 上使用此功能

// ...
success: function (data) {
  var html = '';
  var target = $('#cars');

  // data has to be in this format for the following loop:
  // '{"Car":["Benz","BMW"],"Bike":["Benz"],"Bicycle":["Volvo"]}'

  $.each(data, function(optGroup, elements) {
    html += '<optgroup label="' + optGroup + '">';

    $.each(elements, function(index, element) {
      html += '<option value="">' + element + '</option>';
    });

    html += '</optgroup>';
  });

  target.html(html);
}
// ...

工作示例

我在下面构建了这个 sn-p 的工作示例

// you said that the data of your success method is json parsed, so you do not neet do parse the data again in your script
setTimeout(function() {
  successMethod(
    JSON.parse('{"Car":["Benz","BMW"],"Bike":["Benz"],"Bicycle":["Volvo"]}')
  );
  // just set 3 seconds for testing
}, 3000)

function successMethod(data) {
  var html = '';
  var target = $('#cars');

  // data has to be in this format for the following loop:
  // '{"Car":["Benz","BMW"],"Bike":["Benz"],"Bicycle":["Volvo"]}'

  $.each(data, function(optGroup, elements) {
    html += '<optgroup label="' + optGroup + '">';

    $.each(elements, function(index, element) {
      html += '<option value="">' + element + '</option>';
    });

    html += '</optgroup>';
  });
  
  target.html(html);
}
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" />

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"></script>

<label for="name">CARS</label>
<select multiple title="Cars" class="custom-select" id="cars">
  <optgroup label="Car">
    <option>Benz</option>
    <option>BMW</option>
    <option>Volvo</option>
    <option>Hyundai</option>
  </optgroup>
  <optgroup label="Bike">
    <option>Benz</option>
    <option>BMW</option>
    <option>Volvo</option>
    <option>Hyundai</option>
  </optgroup>
  <optgroup label="Bicycle">
    <option>Benz</option>
    <option>BMW</option>
    <option>Volvo</option>
    <option>Hyundai</option>
  </optgroup>
</select>

【讨论】:

  • 多选已经存在,脚本应该只根据ajax调用成功选择适当的选项。
  • @Mahdi 是的,你只需要使用我在这个例子中使用的$('.selectpicker').multiselect('rebuild'); 方法。请向我们展示您当前的代码,以便我们更好地帮助您。
  • 抱歉耽搁了,我检查了你的代码,但我得到了错误:Uncaught TypeError: target.multiselect is not a function
  • @Mahdi 对于这种情况,您没有包含 bootstrap-multiselect jquery 脚本。我的答案中的代码 sn-p 似乎适用于您在问题中链接的 bootstrap-multiselect。
  • 是的,不幸的是,这是我的错误。我使用的是 Bootstrap-Select 而不是 bootstrap-multiselect
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-28
  • 1970-01-01
  • 2019-07-08
  • 1970-01-01
相关资源
最近更新 更多