jQuery使用多个数组提交ajax
嗨,我正在尝试使用ajax内部的submitHandler提交一个表单,也使用美化多个选择的库。以下工作:jQuery使用多个数组提交ajax,jquery,ajax,nested,associative-array,serializearray,Jquery,Ajax,Nested,Associative Array,Serializearray,嗨,我正在尝试使用ajax内部的submitHandler提交一个表单,也使用美化多个选择的库。以下工作: submitHandler: function(form) { var form = $(this.currentForm); var data = { first_name : form.find('#first_name').attr('value'), last_name : form.find('#la
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框架,所以我希望有一个简单的解决方案
另外,我正在使用php5和jquery1.8.3。以下是我到目前为止发现的情况,也许我只是在尝试添加selects数组之前弄乱了它的格式:
谢谢 您需要的是序列化主窗体本身:
$('form').submit(function() {
var data = $(this).serialize();
e.preventDefault();
$.ajax({
type : "POST",
url : "formhandler.php",
data : data,
success : function(response) {
console.log(response);
}
});
});
我不知道为什么这对我来说如此痛苦,但我最终发现了如何为ajax格式化数组。数组的URL编码方式让我很惊讶。。我不确定深度嵌套是否真的得到普遍支持。以下是ajax可以获取的各种版本的阵列数据:
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"
下面是我添加自己数组的方法。if(values)行是可选的,但如果没有它,else案例将不会触发,因此如果未选择任何内容,则您根本无法在服务器上获取所选的_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' : ''});
只是发布这个答案,希望它能帮助别人。为什么不直接执行
form.serializeArray()
?您是在尝试获取表单中所有元素的值,还是仅获取一些元素的值?嘿,谢谢您的快速回复。不幸的是,它没有工作,以下是输出:数组(['first\u name']=>'John'['last\u name']=>'Smith'['selected\u people']=>4)出于某种原因,它没有序列化所选择的多选择。将你的答案与这一点结合在一起,我认为jQuery需要考虑更新过时的序列化函数来处理对象、关联数组、数值数组的真实世界混合。如果它们能找到一种优雅的识别方法,甚至可能序列化数组。是的,你说得对。但我不知道你有多选:)