2013-11-05 119 views
1

我試圖序列化多個複選框將具有相同名稱的窗體上的複選框。將複選框轉換爲JSON數組

<input name="mycheckbox" type="checkbox" value="A"/>A</br>  
<input name="mycheckbox" type="checkbox" value="B"/>B</br> 

使用如下的serializeArray一切都很好。如果兩個甲& B被檢查JSON.stringify正確地表示JSON作爲數組:

{"mycheckbox":["A","B"]} 

然而,如果我只有一個檢查JSON不再表示爲一個數組:

{"mycheckbox":"A"} 

在我正在處理的RESTful後端中,我需要始終以數組的形式傳遞。有沒有強制stringify將其表示爲數組的方法?

var jsonData = JSON.stringify($('form').serializeObject()); 

$.fn.serializeObject = function() { 
    var o = {}; 
    var a = this.serializeArray(); 
    $.each(a, function() { 
     if (o[this.name] !== undefined) { 
      if (!o[this.name].push) { 
       o[this.name] = [o[this.name]]; 
      } 
      o[this.name].push(this.value || ''); 
     } else { 
      o[this.name] = this.value || ''; 
     } 
    }); 
    return o; 
}; 

回答

0

您必須按名稱找到表單中的每個元素並檢查它是否爲複選框。

但請注意,擁有多個文本框,密碼和文件上傳等功能也是完全有效的。沒有任何方式將表單輸入定義爲「多個」,除非您碰巧看到表單時出現兩個具有相同名稱的成功控件。

當你知道你需要一個數組時,在後端處理它可能會更容易。或者用簡單的舊格式編碼而不是JSON提交表單,並讓後端的HTTP庫處理它。 (他們大多數讓你做一些像request.GET.getall('mycheckbox')這樣的東西,總是得到一個列表。)

0

如果你不想直接修改插件的代碼,你可以簡單的修改對象。

var formData = $('form').serializeObject(), 
    mycheckboxVal = formData.mycheckbox; 

if (!$.isArray(mycheckboxval)) { 
    formData.mycheckbox = [mycheckboxval]; 
} 

//then you serialize 
var jsonData = JSON.stringify(formData); 

如果您願意,您也可以執行相同的邏輯服務器端。