我可以将选项加载到selectize js选择框。但是我如何从中获取数据值?例如:
$('#product_id').append('<option data-no_of_reams="'+data[i].no_of_reams+'" value="'+data[i].id+'">'+data[i].c_code+'</option>');
我从中获取了该值,但无法从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');
}
});
});
}
提前致谢
答案 0 :(得分:6)
您可以使用data-data
中的option
在新版本中轻松完成此操作。您可以静态或以编程方式创建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>
此外,如果您使用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>
而且,根据选择性文档,当您使用render
和valueField
时,您将覆盖默认<option value="val">name</option>
,因此这些内容会从data-data
中提取而不是<option>
根据{{1}}上的实际值自动设置。您可以看到这一点,因为即使<option>
文字是期望预订,它实际上只会显示name
中的data-data
字段 - 在这种情况下只是<强烈的>期望值很高
答案 1 :(得分:0)
选择问题的方法是,在构建组合框插件时,使用其值和标签复制初始选择选项,但显然它会忽略所有其他属性,包括data-*
个。插件初始化后,基本上没有数据属性,因此您无法读取选定的选项no_of_reams
。
我附带的解决方法是将数据对象存储在select元素内部数据中,以便以后可以访问它。这将有效:
$.ajax({
url: '/inward/allccode/',
type: 'GET',
datatype: 'JSON',
success: function(data) {
$('#product_id').append('<option value="">Select</option>').data('data', data);
for (var i in data) {
$('#product_id').append('<option value="' + data[i].id + '">' + data[i].c_code + '</option>');
}
}
}).done(function() {
$('#product_id').selectize({
onChange: function(value) {
var selectedObj = this.$input.data('data').filter(function(el) {
return el.id === Number(value);
})[0];
alert(selectedObj.no_of_reams)
}
});
});
非常方便:现在在onChange回调中你有整个selectedObj
,所以你甚至不再需要数据属性了。
答案 2 :(得分:0)
使用此版本,您无需更改HTML。适用于jQuery .data()以及
// assuming HTML that looks like:
// <select id='mySelect'>
// <option val='123' data-myparam='ONE'>My Option 1</option>
// <option val='123' data-myparam='TWO'>My Option 2</option>
// </select>
$(document).ready( function(){
// keep .data (selectize ver 0.12.4 bug / library deletes .data by default)
$('#mySelect').selectize({
onInitialize: function(){
var s = this;
this.revertSettings.$children.each( function(){
$.extend(s.options[this.value], $(this).data());
});
}
});
// Then to read back in:
$('#mySelect').on('change', function(){
var s = $('#mySelect')[0].selectize; //get select
var data = s.options[s.items[0]]; //get current data() for the active option.
alert('your data is: ' + data.myparam);
});
})
<link href="https://cdnjs.cloudflare.com/ajax/libs/selectize.js/0.12.4/css/selectize.default.min.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/selectize.js/0.12.4/js/standalone/selectize.min.js"></script>
<select id='mySelect'>
<option val='123' data-myparam='ONE'>My Option 1</option>
<option val='123' data-myparam='TWO'>My Option 2</option>
</select>
答案 3 :(得分:-1)
如果只是javascript,请使用getAttribute('data-whatever')
。
如果使用jquery,请使用.data('whatever')
。
$(document).ready(function() {
var reamsArr = ['34', '44', '55'];
$.each(reamsArr, function(index, val) {
$('#product_id').append("<option value=" + val + " data-no_of_reams=" + val + ">" + val + "</option>");
})
$("#product_id").on("change", function() {
alert($("#product_id option:selected").data("no_of_reams"));
})
})
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<select id="product_id"></select>
&#13;