2014-06-21 40 views
1

我有一個複選框作爲一個標誌的形式。jQuery的 - serializearray()沒有得到選中的複選框的值

爲了做到這一點,我添加了一個隱藏的輸入元素,因此如果未選中該複選框,東西仍然被保存

<form action=""> 
    ... 
     <input type="hidden" name="foo" value="no" /> 
     <input type="checkbox" name="foo" value="yes"> 
    ... 
</form> 

我遇到的問題是,當我

  1. 選中複選框
  2. 然後形式上運行jQuery.serializeArray()

爲foo元素設置的值爲「否」

Object { name="foo", value="no"} 

不應該serializeArray()模擬瀏覽器行爲?如果是這樣,如果複選框被選中,不應該返回「是」嗎?

我使用jQuery v1.10.2的

+1

嘗試用隱藏和checkbox類型的輸入不同的名稱。 – dotnetstep

+0

@dotnetstep相同的名字是故意的,因爲這只是我想傳遞的一個值。 – arvinsim

回答

1

在很短的一句話:否。serializeArray方法只返回它檢查的情況下的複選框。因此,只要未被選中,它就會忽略。 但是,如果您檢查了它,它將直接返回您輸入的值。

查看演示http://api.jquery.com/serializearray/

2

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

+1

所以你說serializeArray()不能決定提交哪個值,不像沒有JS的普通表單發佈那樣呢? – arvinsim

+0

不,當數據通過$ .post('url',$('form')。serializeArray())發送時;'它發送兩個數據。我只是顯示兩個數據都被記錄下來,兩個數據都通過ajax發佈。這意味着你的服務器沒有正確讀取數據,很可能是因爲2個元素相同。我建議你從複選框中刪除名稱,並在更改時更新隱藏字段以消除混淆。我會在我的回答中暫時添加此代碼。 –

+0

@arvinsim我已經更新了我的答案的底部,以包含另一種方式,而不使用任何隱藏字段。這將真正幫助擺脫任何混淆,爲自己和服務器接收這些數據。 –

0

的多個字段使用相同的名稱是有問題的,充其量,也沒有標準化的方式,前端系統或後端系統,將處理它。

使用相同名稱的唯一原因是,如果你想通過某種默認值,就像你在下面的情況下,你在哪裏做一個簡單的是/否。

你想要什麼,模仿瀏覽器,是serialize方法,而不是serializeArray

我加入了形式到頁面 - 從我的控制檯:

JSON.stringify(f.serializeArray()); 
"[{"name":"foo","value":"no"}]" 

NO對號

JSON.stringify(f.serialize()); 
""foo=no"" 

對號

JSON.stringify(f.serialize()); 
""foo=yes&foo=no"" 

如果您的後端系統感到困惑並且正在採摘錯誤的值,顛倒你的複選標記和隱藏元素的順序。

+0

奇怪的是我嘗試了serialize(),它獲得了與serializeArray()相同的行爲。也就是說,即使複選框被選中,它仍然只傳遞「foo = no」。 – arvinsim

+0

當你說*它只通過*,你從哪裏得到這些信息?如果您的後臺只顯示一個值,這是正常和正確的。 –

+0

我使用了這個'console.info(JSON.stringify(formElement.serialize()));'在執行AJAX提交的代碼之前。 – arvinsim