2010-06-12 42 views
54

我使用jQuery.serialize來檢索窗體中的所有數據字段。jQuery序列化不註冊複選框

我的問題是,它不檢索未選中的複選框。

它包括這樣的:

<input type="checkbox" id="event_allDay" name="event_allDay" class="checkbox" checked="checked" /> 

但不是這個

<input type="checkbox" id="event_allDay" name="event_allDay" class="checkbox" /> 

我怎樣才能沒有被選中的複選框的 「價值觀」?

+2

我們在ASP網上做的是有一個隱藏的輸入: '' '' 這種方式如果沒有勾選,它會取值爲隱藏的 – 2014-02-11 11:25:22

回答

54

jQuery的serialize密切模仿如何將標準的形式是由瀏覽器附加在查詢之前被序列化請求中的字符串或POST正文。未經檢查的複選框不包含在瀏覽器中,這很有意義,因爲它們具有布爾狀態 - 它們要麼由用戶選擇(包含),要麼不由用戶選擇(未包括)。

如果你需要它在序列化,你應該問自己「爲什麼?爲什麼不檢查它的存在?」。

請記住,如果JavaScript序列化表單數據的方式與瀏覽器的行爲方式有所不同,那麼您將消除表單中任何優雅降級的可能性。如果您仍然絕對需要這樣做,只需使用帶有是/否的<select>框作爲選項。至少這樣,禁用JS的用戶不會與您的網站疏遠,也不會違背HTML規範中定義的行爲。

<select id="event_allDay" name="event_allDay"> 
    <option value="0" selected>No</option> 
    <option value="1">Yes</option> 
</select> 

我已經看到了這個採用在過去的一些網站,總是對自己說,「他們爲什麼不只是使用一個複選框」

如果你想序列化的複選框添加到您的查詢字符串
+17

這會使信息更容易存儲在數據庫中。因爲那麼來自Serialize的字段數將等於表中的字段數。現在我必須控制哪些失蹤。 – Steven 2010-06-13 10:59:10

+16

想要取消選中複選框和取消設置單選按鈕是非常好的情況。這些字段的值可能已經存在於服務器上,而您只是想更新。通過在提交字符串中不包含這些值,它假定您每次都在對記錄進行完整覆蓋。 – mydoghasworms 2011-08-18 10:37:09

+2

@mydog:爲什麼會這樣?如果你問我,這似乎是一個糟糕的設計選擇。如果瀏覽器提交表單數據,這些字段將永遠不會出現在查詢字符串中,那麼爲什麼您將其設計爲與JavaScript不同呢?一開始你就完全消除了任何優雅退化的機會。 – 2011-08-18 13:35:23

25

你不這樣做,因爲serialize是用來作爲查詢字符串的,在這種情況下,unchecked意味着它根本不在查詢字符串中。

如果你真的想選中的複選框的值,使用:(未經測試偏離航向)

var arr_unchecked_values = $('input[type=checkbox]:not(:checked)').map(function(){return this.value}).get(); 
+2

純粹的天才!謝謝! – mydoghasworms 2011-08-18 14:04:23

+0

[下面的答案](http://stackoverflow.com/a/7108685/404699)很好地擴展了這一點。 – steampowered 2012-01-05 00:01:11

17

,以下內容添加到您的jQuery提交功能:

var moreinfo = ''; 

$('input[type=checkbox]').each(function() {  
    if (!this.checked) { 
     moreinfo += '&'+this.name+'=0'; 
    } 
}); 
+0

這將消除任何形式的優雅退化的機會 - 對於禁用JS的用戶,提交的數據會有所不同。 – 2011-08-18 14:03:04

+0

這段代碼需要有);添加到它的最後... – theJerm 2012-09-11 17:29:08

+0

@theJerm,這是完成 – Ash 2012-09-11 18:49:22

0

有時未檢查手段的其他值,例如檢查可能意味着是沒有選中或0,1等等它取決於你想給的意思..所以可能是另一種狀態,除了「未經檢查意味着它根本不在查詢字符串中」

「這會使信息更容易存儲在數據庫中。 Serialize中的字段數量等於表中的字段數量,現在我必須控制哪些字段丟失「,youre對這也是我的問題...所以看來我必須檢查這個不存在的值....

但也許這可能是一個解決方案? http://tdanemar.wordpress.com/2010/08/24/jquery-serialize-method-and-checkboxes/

+1

如果不存在導致的問題,您應該使用帶有yes/no選項的'