在具有多個同名輸入的表單上使用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