2013-01-10 52 views
1

嗨我想提交一個表格使用內部Validate的submitHandler,也使用Chosen庫美化多個選擇。以下作品:jQuery提交與多個陣列的阿賈克斯

submitHandler: function(form) { 
    var  form = $(this.currentForm); 

    var  data = { 
     first_name : form.find('#first_name').attr('value'), 
     last_name  : form.find('#last_name').attr('value'), 
     chosen_people : form.find('#chosen_people').val(), 
    }; 

    $.ajax({ 
     type : "POST", 
     url : "formhandler.php", 
     data : data, 
     success : function(response) { 
      console.log(response); 
     } 
    }); 
} 

服務器響應:

array(
    ['first_name'] => 'John' 
    ['last_name'] => 'Smith' 
    ['chosen_people'] => array(
     [0] => 37 
     [1] => 42 
    ) 
) 

的問題是,我的方式是大和經常變化,我不希望有保留枚舉所有輸入和選擇要素。我想就這樣說:

var  inputs = form.find('input').serializeArray(); 
var  selects = form.find('.chzn-select').val(); 
var  data = $.merge(inputs, selects); 

... 

我試過的手動鍵入東西每樣組合:

for(var select in selects) 
    selects[select] = {'name' : select, 'value' : selects[select]}; 

var  serializedSelects = {'name' : 'chosen_people', 'value' : selects }; 
var  data = $.merge(inputs, serializedSelects); 

但我就是不能得到數組正確嵌套以便服務器在它的post變量中有正確的數組結構。

問題的關鍵在於儘管jQuery爲元素提供了$ .serializeArray(),但它並沒有提供像$ .paramArray()這樣的關聯數組並將其轉換爲序列化數組。它只能輸出序列化的字符串,這些字符串很難進一步處理。我不想包含另一個Ajax框架,所以希望有一個簡單的解決方案。

P.S.我使用php5和jQuery 1.8.3。這是我迄今爲止的發現,也許我只是搞亂了選擇陣列的格式化之前我嘗試添加它:

jQuery post() with serialize and extra data

How to serialize a JavaScript associative array?

Jquery.SerializeArray how to add more parameters to it?

謝謝!

+0

爲什麼不只是'form.serializeArray()'? –

+0

您是否試圖獲取表單中所有元素的值,或者只是一些? – Musa

回答

2

你需要的是序列化的主要形式本身:

$('form').submit(function() { 
    var data = $(this).serialize(); 
    e.preventDefault(); 
$.ajax({ 
    type : "POST", 
    url : "formhandler.php", 
    data : data, 
    success : function(response) { 
     console.log(response); 
    } 
}); 
}); 
+0

嗨,感謝您的快速回復。不幸的是它沒有工作,這裏是輸出: 陣列( [ '如first_name'] => '約翰' [ '姓氏'] => '史密斯' [ 'chosen_people'] => 4 ) 由於某種原因,它沒有遞歸地序列化Chosen multiselect。 –

+0

結合你的答案和這個爲我工作http://stackoverflow.com/a/1186309/539149我認爲jQuery的人需要考慮更新他們過時的序列化函數,以便與真實世界的對象,關聯數組,數值數組,甚至可能是序列化數組,如果他們能夠找到一種識別它們的優雅方式的話。 –

+0

是的,你是對的。但我不知道你有多選:) –

0

我不知道爲什麼,這讓我覺得很痛苦,但我終於找到了如何格式化陣列阿賈克斯。數組被urlencoded的方式給我帶來了......我不確定深層嵌套是否真的被普遍支持。這裏是阿賈克斯可以採取的陣列數據的各種版本:

var  associativeData = {'first_name' : 'John', 'last_name' : 'Smith', 'chosen_people' : Array('37', '42')}; 
var  nameValueData = Array(
    {'name' : 'first_name', 'value' : 'John'}, 
    {'name' : 'last_name', 'value' : 'Smith'}, 
    {'name' : 'chosen_people[0]', 'value' : 37}, 
    {'name' : 'chosen_people[1]', 'value' : 42} 
); 
var  serializedData = "first_name=John&last_name=Smith&chosen_people[]=37&chosen_people[]=42" 

而這裏是什麼對我來說追加我自己的陣列。該如果(值)行是可選的,但沒有它,否則情況永遠不會觸發,所以如果什麼也沒有選擇,你沒有得到chosen_people VAR在所有服務器上:

var  data = form.find('input').serializeArray(); 
var  values = form.find('#chosen_people').val(); 
if(values) 
for(var value in values) 
    data.push({'name' : 'chosen_people[' + value + ']', 'value' : values[value]}); 
else 
    data.push({'name' : 'chosen_people[]', 'value' : ''}); 

的希望就在發佈這個答案它有助於某人。