【问题标题】:jQuery: remove not selected choices before appending new via AJAX for Chosen JSjQuery:在通过 AJAX 为 Chosen JS 添加新选项之前删除未选择的选项
【发布时间】:2019-05-26 05:09:06
【问题描述】:

我有我的 ChosenJS 多选输入,我通过 AJAX 动态获取选项:

  $("#offer_tags").chosen({
    max_selected_options: 30,
    max_shown_results: 30,
  });

  $("#offer_tags_chosen input").autocomplete({
      minLength: 3,
      source: function( request, response ) {
          $.ajax({
              url: "/common/offer_tags?search="+request.term,
              dataType: "json",
              beforeSend: function(){}
          }).done(function( data ) {
                  response(
                    $('#offer_tags_chosen ul.chosen-results').each(function () {
                      console.log(this);
                    }),
                    $('#offer_tags').append('<option>' + request.term + '</option>'),

                    $.map( data, function( item ) {
                      $('#offer_tags').append('<option value='+ item.id +'>' + item.name + '</option>');
                    })
                  );
                  $("#offer_tags").trigger("chosen:updated");
          });

      }
  });

目前看起来一切正常,但是我想在添加新选项之前删除未选择的选项。

到目前为止,我的想法是访问ul.chosen-results,然后删除所有li.active-results

有了这段代码

$('#offer_tags_chosen ul.chosen-results').each(function () {
  console.log(this);
})

我可以在我的控制台中获得ul.chosen-results

<ul class="chosen-results">
  <li class="active-result" data-option-array-index="0" style="">myvalue</li>
  <li class="active-result" data-option-array-index="1" style="">othervalue</li>
  <li class="active-result" data-option-array-index="2" style="">thirdvalue</li>
</ul>

但是,当我尝试通过以下方式访问 children 时:

$('#offer_tags_chosen ul.chosen-results').each(function () {
  console.log($(this).children());
})

它给了我这个:

w.fn.init [li.no-results, prevObject: w.fn.init(1)]
0: li.no-results
length: 1
prevObject: w.fn.init [ul.chosen-results]
__proto__: Object(0)

请问我做错了吗?如何在附加新选项之前删除未选择的选项?我需要保留选定的选项 - 不删除。

更新

我的 HTML 如下所示:

<div class="chosen-container chosen-container-multi" style="width: 936px;"
      title="" id="offer_tags_chosen">
  <ul class="chosen-choices">
    <li class="search-field">
      <input type="text" value="Please, select (multiple allowed)"
             class="default ui-autocomplete-input" autocomplete="off"
             style="width: 215.387px;">
    </li>
  </ul>
  <div class="chosen-drop">
    <ul class="chosen-results">
      <li class="active-result" data-option-array-index="0" style="">myvalue</li>
      <li class="active-result" data-option-array-index="1" style="">othervalue</li>
      <li class="active-result" data-option-array-index="2" style="">thirdvalue</li>
    </ul>
  </div>
</div>

console.log($(this).children().get()); 给我:

[li.no-results]
0: li.no-results
length: 1
__proto__: Array(0)

【问题讨论】:

  • 请用相关的html更新你的代码(你只提供了ul html,还不够,#offer_tags_chosen div在哪里?),如果你能做一个sn-p就好了一个可以帮助您更轻松。
  • @tcj 请看我上面的更新。我会检查我是否也可以添加一些 sn-p。
  • 您尝试删除所有具有 'active-result' 类的 li ?
  • @Shree 是的,我想删除 li.active-result,但保留已选择的选项 - 具有类 result-selected。对于每个 AJAX 请求,我可以获得新的选项列表并始终保持选中状态,但删除未选中的选项。
  • 你可以试试 console.log($(this).children().get());

标签: jquery jquery-chosen


【解决方案1】:

不是从ul循环从li开始的。

$('#offer_tags_chosen ul.chosen-results li'.

尝试使用get()not 选择器,如下所示。我在第 4 个 li 值上添加了类 result-selected,该值未出现在控制台上。

$('#offer_tags_chosen ul.chosen-results li').not('.result-selected').each(function() {
  console.log($(this).get());
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.0/jquery.min.js"></script>
<div class="chosen-container chosen-container-multi" style="width: 936px;" title="" id="offer_tags_chosen">
  <ul class="chosen-choices">
    <li class="search-field">
      <input type="text" value="Please, select (multiple allowed)" class="default ui-autocomplete-input" autocomplete="off" style="width: 215.387px;">
    </li>
  </ul>
  <div class="chosen-drop">
    <ul class="chosen-results">

      <li class="active-result" data-option-array-index="0" style="">Select</li>
      <li class="active-result" data-option-array-index="1" style="">othervalue</li>
      <li class="active-result" data-option-array-index="2" style="">thirdvalue</li>
      <li class="active-result result-selected" data-option-array-index="4" style="">4thvalue</li>
    </ul>
  </div>
</div>

【讨论】:

  • 谢谢,但是当我在我的 AJAX 响应中实现这一点时,我得到 [li.no-results] 出于某种原因我无法访问 $('#offer_tags_chosen ul.chosen-results li' - 它给了我第一个选择的 JS 默认“无结果”@ 987654332@。我在chosen-results 中看到了我的选项,但无法访问它们。我不知道,也许那是一些 Chosen JS 特有的东西......
猜你喜欢
  • 2014-07-28
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-28
  • 1970-01-01
相关资源
最近更新 更多