如何使用selectize js从选择框中获取数据值

Kal*_*tim 2 javascript selectize.js

我可以将选项加载到selectize js选择框.但是我如何从中获取数据值?例如:

$('#product_id').append('<option data-no_of_reams="'+data[i].no_of_reams+'" value="'+data[i].id+'">'+data[i].c_code+'</option>');
Run Code Online (Sandbox Code Playgroud)

我从中获取了值但无法从data-no_of_reams="'+data[i].no_of_reams+'".帮助我获取数据来查找数据 data-no_of_reams

完整的代码在这里

function getAllCCode(){
$.ajax({
    url: '/inward/allccode/',
    type: 'GET',
    datatype: 'JSON',
    success: function(data){
        $('#product_id').append('<option value="">Select</option>');
        for (var i in data){
            $('#product_id').append('<option data-size="'+data[i].size_h+'X'+data[i].size_w+'" data-radius="'+data[i].radius+'" data-type="'+get_type(data[i].type)+'" data-meal="'+get_mill(data[i].mill)+'" data-variety="'+get_code(data[i].variety)+'" data-ream_weight="'+data[i].ream_weight+'" data-no_of_reams="'+data[i].no_of_reams+'" value="'+data[i].id+'">'+data[i].c_code+'</option>');
        }
    }
}).done(function() {
    $('#product_id').selectize({
        onChange : function(){
            alert('hello');
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

}

提前致谢

red*_*tep 7

您可以轻松地使用新版本做data-dataoption.您可以option静态或以编程方式(使用$.ajax)创建标记.

诀窍是使用this.options内部选择来访问构建选择控件的原始选项.

<select name="product_id" id="product_id">
  <option value="123" data-data="{id:'123',no_of_reams:'1212',name:'Great Expectations'}">Great Expectations Book</option>
  <option value="987" data-data="{id:'987',no_of_reams:'7766',name:'Great Gatsby'}">Great Gatsby Book</option>
</select>

<script>
  $('#product_id').selectize({
   valueField: 'id',
   labelField: 'name',
   render: {
     item: function(item, escape) {
       return '<div>' +
         '<div class="title">' + escape(item.name ? item.name : 'no title') + '</div>' +
         '<div class="description">' + escape(item.description ? item.description : 'no description') + '</div>' +
         '</div>';
     },
     option: function(item, escape) {
       return '<div>' +
         '<div class="title">' + escape(item.name ? item.name : 'no title') + '</div>' +
         '<div class="description">' + escape(item.description ? item.description : 'no description') + '</div>' +
         '</div>';
     }
   },
   onChange: function(val) {
     var data = this.options[val]; // <-- This is how to pull data-data from the original options
     console.log(data); // stores the data-data as a json object
     alert(data.no_of_reams);
   }
  });
</script>
Run Code Online (Sandbox Code Playgroud)

此外,如果您使用PHP进行标记,请确保使用如下所示的htmlentities:

<select name="product_id" id="product_id">
  <option value="123" data-data="<?php echo htmlentities(json_encode(array('id' => 123, 'no_of_reams' => 1212, 'name' => 'Great Expectations'))) ?>">Great Expectations Book</option>
  <option value="987" data-data="<?php echo htmlentities(json_encode(array('id' => 987, 'no_of_reams' => 7766, 'name' => 'Great Gatsby'))) ?>">Great Gatsby Book</option>
</select>
Run Code Online (Sandbox Code Playgroud)

并且,根据选择文档,当您使用render和时valueField,您将覆盖默认值<option value="val">name</option>,因此这些是从而data-data不是从实际值中自动设置的<option>.你可以看到这一点,因为即使<option>文本是Great Expectations Book,它实际上只显示name来自data-data- 在这种情况下只是远大期望

  • 使用“var data = this.options[val];”的onChange技巧/方法 非常好。正是我所需要的,以便为所选项目重用完整的 AJAX 数据集。谢谢。 (2认同)