如何通过jQuery向我的Ajax表单提交添加自定义哈希?

时间:2012-09-21 18:50:57

标签: javascript coffeescript

我提交的表格是这样的:

formdata = $("#app_form").serialize()
formdata['apps'] = apps
hash = { type: "POST", url: "create_all", data: formdata }
$.ajax(hash)

formdata 帖子,但行:

formdata['apps'] = apps

完全忽略。我无法理解Coffeescript和Javascript如何完全忽略一行。非常有趣。

apps 哈希具有以下结构:

{ "a" => { "1", "2", "3" },
  "b" => { "4", "5", "6" },
  ...
  "n" => { "x", "y", "z" } }

如果:

formdata['apps'] = apps
执行后

无效:

formdata = $("#app_form").serialize()

那么如何在提交之前将应用哈希添加到 formdata 哈希?

3 个答案:

答案 0 :(得分:2)

.serialize()返回查询字符串而不是对象,因此要在查询字符串中添加参数,请使用字符串连接

formdata += '&apps=' + encodeURIComponent(apps);

假设apps是一个字符串。

答案 1 :(得分:1)

jQuery.ajax()例程期待一个对象(哈希),所以你根本不想序列化为一个字符串,只需拉入所有表单数据。

幸运的是,在表单数据版本.serializeArray()之前,jQuery中有一个命令版本 - 但是,这会产生一个表单数组:

[ {'name': ..., 'value': ... }, ...] - 不是你想要的。

因此,您可以复制它检索所有表单元素的方式,这是一个相当复杂的过滤器。或者你可以重新安排输出到你需要的输出。

你的apps变量不能通过AJAX轻松传递,我需要先使用JSON.stringify()转换为JSON(或其他形式的序列化)。这是现在大多数浏览器内置的,但建议使用jQuery作为备份加载json2.js(只有在本机例程不可用时才会启用)。您可以使用本机JSON解码例程使用您使用的任何后端语言从JSON恢复apps,几乎所有语言都可以使用它。

var formdata = { 'apps': JSON.stringify(apps) };
$.each($("#app_form").serializeArray(), function(cIndex, cEntry) {
    formdata[cEntry.name] = cEntry.value;
});

$.ajax({ type: "post",
         url: "create_all",
         data: formdata }};

答案 2 :(得分:-1)

从你所说的看起来不像有效的json和jquery数据参数需要有效的json ..

为什么不使用JSON.parse($("#app_form").serialize())

之类的东西