在具有多个同名输入的表单上使用serializeArray
会为每个元素返回多个对象(如果选中)。这意味着以下HTML将返回以下对象。所以有问题的数据在那里并且可用。正因为如此,我假设你试图将数据操作为1个对象,或者将它发布到服务器,该服务器仅考虑来自具有该密钥的第一个值的数据。你只需要确保任何checkbox
元素都优先。
返回的对象:
[
{
name:"foo",
value:"no"
},
{
name:"foo2",
value:"no"
},
{
name:"foo2",
value:"yes"
}
]
HTML:
<form>
<input type="hidden" name="foo" value="no" />
<input type="checkbox" name="foo" value="yes" />
<input type="hidden" name="foo2" value="no" />
<input type="checkbox" name="foo2" value="yes" checked />
</form>
JS:
console.log($('form').serializeArray());
DEMO
另一种方法可以做到这一点的就是摆脱隐藏的字段,并且在您提交表单之前,请检查每个未选中的复选框,并检查serializeArray
中是否有任何具有相同名称的数据。如果不是只是在那里添加它作为off
。
$('#submit').on('click', function(){
var arr = $('form').serializeArray(),
names = (function(){
var n = [],
l = arr.length - 1;
for(; l>=0; l--){
n.push(arr[l].name);
}
return n;
})();
$('input[type="checkbox"]:not(:checked)').each(function(){
if($.inArray(this.name, names) === -1){
arr.push({name: this.name, value: 'off'});
}
});
console.log(arr);
});
DEMO
尝试用隐藏和checkbox类型的输入不同的名称。 – dotnetstep
@dotnetstep相同的名字是故意的,因为这只是我想传递的一个值。 – arvinsim