【问题标题】:JQuery - Getting rid of %5B%5D in .serialize()JQuery - 摆脱 .serialize() 中的 %5B%5D
【发布时间】:2014-07-25 17:31:28
【问题描述】:

我正在使用 AJAX 提交序列化表单。传递给action.php 的数据最终包含 %5B%5D 而不是 []。无论如何要取回 [],还是可以在action.php 中以相同的方式处理数据(即像数组一样)?

表单通过以下方式序列化:

var form_data = $("#form").serialize();

然后我通过$.ajax发送:

$.ajax({
    type: "POST",
    url: "action.php",
    data: {
        form_data: form_data,
        FrmSubmit: 'SubmitButton'
    },
    cache: true,
    success: function (html) {

        $("#show").html(html);
        alert("form success");
    }
});

传递给action.php 的理想数据应该类似于:name=JohnSmith&color[]=blue&color[]=yellow&meal[]=chicken&meal[]=fish

我得到的是: name=JohnSmith&color%5B%5D=blue&color%5B%5D=yellow&meal%5B%5D=chicken&meal%5B%5D=fish

其他问题: 我也尝试过 .param(),但无法真正确定接收到的数据的正面或反面。每个字母最终都被编码在一个密钥中。谁能解释为什么会这样?

【问题讨论】:

  • 这是因为[]按照RFC的严格解释是not allowed in the URL。不要因为做正确的事而讨厌你的图书馆。

标签: php jquery ajax forms


【解决方案1】:

所以你所做的实际上是对数据进行双重序列化。

曾经在这里:

var form_data = $("#form").serialize();

然后在这里:

$.ajax({
    type: "POST",
    url: "action.php",
    data: {
        form_data: form_data,
        FrmSubmit: 'SubmitButton'
    },
    cache: true,
    success: function (html) {

        $("#rsvp_sub").html(html);
        alert("form success");
    }
});

当您将一个对象传递给$.ajaxdata 参数时,它会序列化并对其进行编码

所以...不要那样做。一种选择是这样做:

var form_data = $("#form").serialize() + "&FrmSubmit=SubmitButton";
$.ajax({
    type: "POST",
    url: "action.php",
    data: form_data,
    cache: true,
    success: function (html) {

        $("#rsvp_sub").html(html);
        alert("form success");
    }
});

请注意,如果 FrmSubmitSubmitButton 包含除 AZ、az、0-9 以外的任何内容(我是保守的),或者如果您无法控制它们包含的内容,您会想要使用encodeURIComponent:

var form_data = $("#form").serialize() + "&" +
    encodeURIComponent('FrmSubmit') + "=" +
    encodeURIComponent('SubmitButton');

【讨论】:

  • 谢谢。这很完美!我没有意识到我正在对数据进行双重序列化!
  • @user866339:很高兴有帮助!
猜你喜欢
  • 1970-01-01
  • 2012-12-19
  • 2021-05-15
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
相关资源
最近更新 更多