在具有相同名称的多个输入的表单上使用
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());
演示
另一种方法是去除隐藏字段,在提交表单之前遍历每个未选中的复选框,并检查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