我在生产环境中遇到错误,无法在开发环境中重现它,所以我认为这是浏览器的问题。
我有一个DataTable填充了服务器端进程和一个自定义列,这是一个复选框,这是简化的代码:
$("#data-table").DataTable({
"serverSide" : true,
"ajax" : {
"url" : "/list",
"dataSrc" : "data"
},
"columns" : [{
"data" : function(row) {
return '<input class="id-checkbox" type="checkbox" name="ids[]" value="' + row.id + '">';
},
"class" : "text-center",
"orderable" : false
},{
"data" : "name",
"class" : "text-center",
"orderable" : false
}]
});
然后我有一些jQuery代码,而不是点击一个按钮,然后获取所选项目并将其发布到后端服务器:
$("#button").on("click", function(){
var ids = [];
$('input[type=checkbox]:checked').each(function() {
ids.push(this.value);
});
if (ids.length == 0) {
//POST Ajax request to server
}
});
问题是,ids
数组有时会填充一些ID,而某些“on”字则会填充,因此我的后端会在等待Long
数组时爆炸。这是一个示例堆栈跟踪:
Failed to convert value of type 'java.lang.String' to required type 'java.lang.Long[]';
nested exception is java.lang.NumberFormatException:
For input string: "109287,109286,109273,108820,on,on"
有没有人知道发生了什么?
答案 0 :(得分:1)
“on”将是没有值属性的复选框的值:
<input id="i" type="checkbox">
如果您记录此输入的值,您至少会在Firefox中获得"on"
:
console.log(document.getElementById('i').value);
检查脚本生成的HTML。也许,一些复选框错过了值属性。也许,因为row.id
有时不存在,作为一个想法。
答案 1 :(得分:0)
正如@kodecount评论的那样,问题是同一页面上存在另一个输入复选框,通过添加
解决input[name^=ids]:checked