1

您好我正在尝试在Validate的 submitHandler 中使用 ajax 提交表单,同时使用美化多个选择的Chosen库。以下作品:

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 框架,所以希望有一个简单的解决方案。

PS 我正在使用 php5 和 jQuery 1.8.3。这是我到目前为止所发现的,也许我只是在尝试添加它之前弄乱了选择数组的格式:

带有序列化和额外数据的 jQuery post()

如何序列化 JavaScript 关联数组?

Jquery.SerializeArray 如何添加更多参数呢?

谢谢!

4

2 回答 2

2

你需要的是序列化你的主表单本身:

$('form').submit(function() {
  var data = $(this).serialize();
  e.preventDefault();
$.ajax({
    type : "POST",
    url : "formhandler.php",
    data : data,
    success : function(response) {
        console.log(response);
    }
});
});
于 2013-01-10T20:45:51.673 回答
0

我不确定为什么这对我来说如此痛苦,但我终于找到了如何为 ajax 格式化数组。数组被 urlencoded 的方式让我震惊。我不确定深度嵌套是否真的得到普遍支持。以下是 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 情况永远不会触发,因此如果未选择任何内容,您根本不会在服务器上获得 selected_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' : ''});

只是发布这个答案,希望它可以帮助某人。

于 2013-01-10T23:54:36.420 回答