【问题标题】:Selectize dropdown content not rendered on page load in DOM选择 DOM 中页面加载时未呈现的下拉内容
【发布时间】:2021-04-19 12:34:49
【问题描述】:

我正在使用Selectize.js

在页面加载时检查 Selectized 下拉菜单中的元素时实际内容缺失(在 .selectize-dropdown-content 内):

<div class="selectize-dropdown single aritklmodel" style="display: none;">
  <div class="selectize-dropdown-content"></div>
</div>

点击后会填充内容:

<div class="selectize-dropdown single aritklmodel" style="display: none; visibility: visible; width: 255.617px; top: 34px; left: 0px;">
  <div class="selectize-dropdown-content">
    <div style="display: block" data-marka="2" data-selectable="" data-value="a2" class="">a2</div>
    <div style="display: block" data-marka="1" data-selectable="" data-value="A50">A50</div>
  </div>
</div>

有没有办法在页面加载时填充它?

因为从上面可以看出,我使用自定义数据属性,我根据之前的 Selectized 下拉选择过滤选项。

当前的问题是,当我在第一个下拉列表中进行选择时,过滤器无法正常工作,因为它没有要过滤的内容,因为内容不在 DOM 中,就在我单击第二个下拉列表并且内容填充到 DOM 之后过滤在第一个更改后开始工作。

我尝试触发/模拟点击事件,它不起作用。

我已阅读 API 和使用文档,如果我错过了答案,我不明白(不是以英语为母语的人)

$('select').selectize({

});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
         <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/selectize.js/0.12.6/css/selectize.bootstrap3.min.css" integrity="sha256-ze/OEYGcFbPRmvCnrSeKbRTtjG4vGLHXgOqsyLFTRjg=" crossorigin="anonymous" />
        <script src="https://cdnjs.cloudflare.com/ajax/libs/selectize.js/0.12.6/js/standalone/selectize.min.js" integrity="sha256-+C0A5Ilqmu4QcSPxrlGpaZxJ04VjsRjKu+G82kl5UJk=" crossorigin="anonymous"></script>
<select name="cars" id="cars">
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="mercedes">Mercedes</option>
  <option value="audi">Audi</option>
</select>

编辑:

有没有办法以编程方式取消选择 HTML 选择,所以我可以对 HTML 选择本身进行过滤,然后再次选择它?

有什么方法可以根据另一个选择的下拉列表进行过滤吗?使用数据属性还是其他?

【问题讨论】:

  • 你能创建工作代码吗?
  • @Swati 我尝试搜索 CDN 或其他来源以在小提琴中包含 selectize,找不到它...
  • 你也可以找到herehere
  • @Swati 我添加了小提琴。加载时selectize-dropdown-content内没有选项
  • 这是默认行为,因为我不确定是否有任何替代方案,如果我发现我会告诉你。

标签: javascript jquery selectize.js


【解决方案1】:

您可以在页面加载时使用refreshOptions 方法来populate 选项

示例 1

// initialize the Selectize control
var $select = $('select').selectize({});

// fetch the instance
var selectize = $select[0].selectize; // 0 for select index
selectize.refreshOptions(false); // populate option on load
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/selectize.js/0.12.6/css/selectize.bootstrap3.min.css" integrity="sha256-ze/OEYGcFbPRmvCnrSeKbRTtjG4vGLHXgOqsyLFTRjg=" crossorigin="anonymous" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/selectize.js/0.12.6/js/standalone/selectize.min.js" integrity="sha256-+C0A5Ilqmu4QcSPxrlGpaZxJ04VjsRjKu+G82kl5UJk=" crossorigin="anonymous"></script>
<select name="cars" id="cars">
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="mercedes">Mercedes</option>
  <option value="audi">Audi</option>
</select>

示例 2

// initialize the Selectize control
var $select = $('select').selectize({
    render: {
        option: function(data, escape) {
            return "<div class='option selected' data-id='" + escape(data.id) + "'>" + escape(data.text) + "</div>"
        }
    }
});

// fetch the instance
let car_select = $select[0].selectize; // 0 index for car select
let model_select = $select[1].selectize; // 1 index for model select
model_select.refreshOptions(false); // populate model select options on page load
car_select.on('item_add', function(value, item) {
   let selector = model_select['$dropdown_content'].children();
   model_select.setValue('none');
   selector.hide();
   selector.each(function() {
       let tmp = $(this);
       if (tmp.data('id') == value) {
           tmp.show();
       }
    })
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/selectize.js/0.12.6/css/selectize.bootstrap3.min.css" integrity="sha256-ze/OEYGcFbPRmvCnrSeKbRTtjG4vGLHXgOqsyLFTRjg=" crossorigin="anonymous" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/selectize.js/0.12.6/js/standalone/selectize.min.js" integrity="sha256-+C0A5Ilqmu4QcSPxrlGpaZxJ04VjsRjKu+G82kl5UJk=" crossorigin="anonymous"></script>
<select name="cars" id="cars">
  <option data-id="volvo" value="volvo">Volvo</option>
  <option data-id="saab" value="saab">Saab</option>
  <option data-id="mercedes" value="mercedes">Mercedes</option>
  <option data-id="audi" value="audi">Audi</option>
</select>
<select name="models" id="models">
  <option data-data='{"id":"none"}' value="none">--Select model --</option>
  <option data-data='{"id":"volvo"}' value="volvo xc90">Volvo XC90</option>
  <option data-data='{"id":"volvo"}' value="volvo xc60">Volvo XC60</option>
  <option data-data='{"id":"saab"}' value="saab 900 convertible">Saab 900 Convertible</option>
  <option data-data='{"id":"mercedes"}' value="mercedes benz C class">Mercedes Benz C Class</option>
  <option data-data='{"id":"mercedes"}' value="mercedes benz A class">Mercedes Benz A Class</option>
  <option data-data='{"id":"audi"}' value="audi e-tron">Audi E-Tron</option>
  <option data-data='{"id":"audi"}' value="audi a7">Audi A7</option>
</select>

【讨论】:

  • refreshOptions 是我错过的东西,谢谢。
  • @ikiK 感谢和抱歉,我在帖子中打错了refreshItems
【解决方案2】:

这是替代解决方案

无论何时单击您的selectize-input,您都可以检查发生单击事件的输入是否与取决于此执行任务的选择相关。如果它用于something(仅作为示例),那么您首先需要隐藏selectize-dropdown-content 内的所有 div,然后检查数据属性是否与 cars 选择框的值匹配,这取决于此显示 div 否则隐藏。此外,由于单击输入框会生成 div,因此您可以制作一个默认选择的选项。

演示代码

$('select#cars').selectize();
$('select#something').selectize({
  render: {
    option: function(data, escape) {
      return "<div class='option selected' data-marka='" + escape(data.marka) + "'>" + escape(data.text) + "</div>"
    }
  }
});

$(".selectize-input").on('click', function() {
  var selector = $(this).closest(".outer").find(".selectize-dropdown-content div")
  //get value of other select
  var value = $("#cars").val()
  //check if id is something
  if ($(this).closest(".outer").find('select').attr('id') == "something") {
    selector.hide() //hide divs
    selector.each(function() {
      //see if data-marka match value
      if ($(this).data('marka') === value || $(this).data('value') == 'none') {
        $(this).show() //show that div
      }
    })
  } else {
    //if cars select box is change find next select-box input and change it to default
    $(this).closest(".outer").next().find(".selectize-control .item").attr('data-value', "none")
    $(this).closest(".outer").next().find(".selectize-control .item").text("--Select one --");
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/selectize.js/0.12.6/css/selectize.bootstrap3.min.css" integrity="sha256-ze/OEYGcFbPRmvCnrSeKbRTtjG4vGLHXgOqsyLFTRjg=" crossorigin="anonymous" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/selectize.js/0.12.6/js/standalone/selectize.min.js" integrity="sha256-+C0A5Ilqmu4QcSPxrlGpaZxJ04VjsRjKu+G82kl5UJk=" crossorigin="anonymous"></script>
<div class="outer">
  <select name="cars" id="cars">
    <option value="volvo">Volvo</option>
    <option value="Saab">Saab</option>
    <option value="mercedes">Mercedes</option>
    <option value="audi">Audi</option>
  </select>
</div>
<div class="outer">
  <select id="something">
    <option value="none">--Select one --</option>
    <option data-data='{"marka": "volvo"}' value="1">1</option>
    <option data-data='{"marka": "volvo"}' value="2">2</option>
    <option data-data='{"marka": "Saab"}' value="3">3</option>
    <option data-data='{"marka": "audi"}' value="4">4</option>
    <option data-data='{"marka": "mercedes"}' value="5">5</option>
    <option data-data='{"marka": "mercedes"}' value="6">6</option>
  </select>
  <div>

【讨论】:

  • 创意,在单击第二个下拉列表后基于选定的第一个下拉列表进行过滤的想法不知何故跳过了我的想法。谢谢。
猜你喜欢
  • 1970-01-01
  • 2017-05-06
  • 2013-03-11
  • 2018-02-28
  • 2012-06-12
  • 2020-09-27
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
相关资源
最近更新 更多