【问题标题】:How to add data to a form when submitting via a POST AJAX request? [duplicate]通过 POST AJAX 请求提交时如何向表单添加数据? [复制]
【发布时间】:2014-07-17 16:27:40
【问题描述】:

我正在使用 jQuery 的 $.ajax() 函数来提交表单。我像这样传递表单数据:

data: form.serialize()

但是,我想向 POST 请求添加其他数据。

根据this answer,这样做的方法是在表单上使用serializeArray(),然后将数据推送到生成的对象数组上。问题是当我尝试序列化结果数组时,jQuery 返回错误。

这是一个例子:

<form id="test">
    <input type="hidden" name="firstName" value="John">
    <input type="hidden" name="lastName" value="Doe">
</form>

JS:

console.log($("#test").serialize()); // firstName=John&lastName=Doe 

var data = $("#test").serializeArray();
console.log(data); // [Object, Object]

data.push({name: 'middleName', value: 'Bob'});
console.log(data); // [Object, Object, Object]

console.log(data.serialize()); // Uncaught TypeError: undefined is not a function 

JSFiddle

我做错了什么?

【问题讨论】:

  • 你为什么要打电话给serialize?只需按照链接答案中的示例代码进行操作即可。在你的 AJAX 调用中使用data,它就准备好了。喜欢data: data
  • 您是否尝试在.push() 之后在您的ajax 调用中使用数据;你不应该尝试序列化数组。
  • @kapa 我为$.ajax() 找到的示例显示数据作为form.serialize() 传递,它将输入放入字符串中(就像GET 请求一样)。这就是为什么我试图在数组上调用serialize(),将其转换为字符串。
  • 你也可以使用 JSON jsfiddle.net/hqj4E/1
  • @Nate 只需阅读文档而不是盲目地遵循示例。或者盲目地遵循示例,并简单地从链接问题的答案中复制它。这两种方法都适用于这种情况:)。

标签: javascript jquery ajax forms


【解决方案1】:

正如 kapa 所指出的,jQuery 允许您将从serializeArray() 获得的数组直接作为data 参数传递,因此您的代码可以像这样简单;

var data = $("#test").serializeArray();

data.push({name: 'middleName', value: 'Bob'});

jQuery.ajax({
    data: data,
    // Other params
});

但是,要解释为什么您以前的代码不起作用(从这里开始我以前的答案); serializeArray() 从字面上返回一个数组。数组没有serialize() 方法;这就是您的代码失败的原因。

不要在serializeArray()返回的数组上使用serialize(),而是调用jQuery.param()

var data = $("#test").serializeArray();

data.push({name: 'middleName', value: 'Bob'});
console.log(jQuery.param(data));

jQuery.param()专门用于将serializeArray()生成的{ name, value }对转换为查询字符串。

【讨论】:

  • 这是不必要的 AFAIK。 jQuery 将能够简单地使用data
  • @kapa:啊,你是对的。我没有意识到 jQuery 支持这一点。我会更新我的答案!
  • 感谢您让我知道jQuery.param(...)。我必须开始使用它。
【解决方案2】:

serialize 是一个用于序列化表单对象的 jquery 方法。一旦你调用serialize,你就不再有一个 jquery 对象,因此你不能序列化它。您应该能够通过使用 JSON 对象对其进行字符串化,将您的 JSON 对象传递给 $.ajax

$.ajax({
   data: JSON.stringify(data)
   //...
});

【讨论】:

  • -1 为什么要将其转换为 JSON?什么是您的语言中的 JSON 对象? :)
  • 这不会为您提供与正常序列化相同的 POST 数据。
【解决方案3】:

除了其他答案之外,有时在序列化之前简单地添加隐藏的输入元素会更容易。

$('<input type=hidden>').attr({name:'middleName',value:'bob'}).appendTo('form#test')

【讨论】:

  • 这应该是评论而不是答案,因为它没有回答问题。
猜你喜欢
  • 2017-02-18
  • 2012-06-30
  • 2020-02-28
  • 2017-07-07
  • 2019-08-26
  • 1970-01-01
  • 2018-11-26
  • 1970-01-01
  • 2016-02-29
相关资源
最近更新 更多