【问题标题】:JQuery parameter serialization without the bracket messJQuery参数序列化没有括号混乱
【发布时间】:2010-03-29 19:56:30
【问题描述】:

我正在使用 JQuery 向服务器发出 JSON 请求,似乎它的参数序列化是硬编码到 PHP 所期望的,而不是本质上是通用的。基本上我有一个看起来像这样的对象:

{
    foo: 1,
    bar : [1, 3, 5]
}

并将其序列化为:

foo=1&bar[]=1&bar[]=3&bar[]=5

有什么办法可以做到吗?

foo=1&bar=1&bar=3&bar=5

在我看来,jQuery 不应该如此依赖于少数服务器端框架所期望的命名约定。如果我希望我的参数被称为 bar[],如果这是我的服务器端代码所期望的,我可以很容易地自己命名它。

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    我假设您使用的是 JQuery 1.4。你应该看看这个:http://benalman.com/news/2009/12/jquery-14-param-demystified/

    作者讨论了他们为什么让 JQuery 以这种方式运行,并提出了一些很好的观点。例如,如果不使用“方括号语法”,则不能传入只有单个值的数组。

    他还提供了一种解决方法:

    $.ajaxSetup({ traditional: true });
    

    这将告诉 JQuery 使用非括号方法进行序列化。

    【讨论】:

    • 好吧,如果你的服务器端语言/框架不支持来自查询字符串的单元素数组,那是你的问题:) 让我回到我原来的观点,如果你的服务器端框架需要括号,那么您应该更改您的参数名称以匹配,而不是使其成为与服务器无关的前端库的默认值。
    • 如果您提倡的方法在某种程度上是“正确的”方法,我想您的论点会更有说服力。显然,没有 RFC 或标准涵盖应该如何处理数组语法,而且看起来更新的技术正在选择使用更灵活的选项。你说 JQuery 不应该被绑定到“命名约定”,但它显然支持这两种方法,你可以很容易地争辩说非括号语法是做绑定的语法。
    • 有 jQuery API 声明:jQuery 用相同的键序列化多个值,即 {foo:["bar1", "bar2"]} 变为 '&foo=bar1&foo=bar2'。注意在提供的示例中如何没有出现括号...
    • @Amir - 适用于 JQuery 1.3。 JQuery 1.4 用括号来做,除非你将traditional 设置为true,这就是我在回答中解释的。有关示例,请参见本页底部:api.jquery.com/jQuery.param
    • API 有点过时,请参阅“数据”下的api.jquery.com/jQuery.ajax。你的回答对我帮助很大,之前忘了提。谢谢!
    【解决方案2】:

    可以使用$.param(obj,true) 将对象转换为参数化字符串。第二个布尔参数表示应使用序列化对象的传统方法。传统方法在遇到相同的参数名时不使用方括号。从$.param返回的序列化字符串可以通过任何ajax方法传递。

    此方法优于使用 $.ajaxSetup(),正如 jQuery Documentation 所指出的那样:

    注意:此处指定的设置将影响对 $.ajax 或 基于 AJAX 的衍生工具,例如 $.get()。这可能会导致不受欢迎的 行为,因为其他调用者(例如,插件)可能期待 正常的默认设置。出于这个原因,我们强烈推荐 反对使用此 API。相反,在 调用或定义一个简单的插件来做到这一点。

    示例:

    var obj = {myProp: "test", arr: [1,2,3,4]};
    var serializedObj = $.param(obj, true); //myprop=test&arr=1&arr=2&arr=3&arr=4
    
    $.post(url,serializedObj,function(){});
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-11
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 2019-08-05
      相关资源
      最近更新 更多