jQuery在URL编码对象时处理不正确的数组?

时间:2013-03-20 12:24:26

标签: jquery ajax urlencode

将对象作为data传递给ajax时,我收到了一些意想不到的结果。出于某种原因,如果jQuery的值是数组,jQuery会在我的参数名称中添加方括号。例如......

var obj =
    {
        name: "John Doe",
        courses: [ 1, 2, 4 ]
    };

...变为name=John+Doe&courses[]=1&courses[]=2&courses[]=4而不是name=John+Doe&courses=1&courses=2&courses=4

为什么jQuery添加方括号?

以下是一个工作示例:http://jsfiddle.net/BrHSy/

更新

我希望上面的示例生成一个类似于此示例中的查询字符串的字符串:

<html>
    <head></head>
    <body>
        <form method="GET">
            <input type="hidden" name="name" value="John Doe"/>
            <input type="hidden" name="courses" value="1"/>
            <input type="hidden" name="courses" value="2"/>
            <input type="hidden" name="courses" value="4"/>

            <button>Go!</button>
        </form>
    </body>
</html>

请注意,表单(www-form-urlencoded)生成的查询字符串没有方括号。

1 个答案:

答案 0 :(得分:4)

我找到了自己的答案。当使用$.param对数据进行编码时,jQuery看起来像jQuery,并不特别www-form-urlencode数据。它正在序列化它。在jQuery 1.4之前,结果将如预期的那样。

然后,我的解决方案是通过传递true

来使用传统逻辑
$.param(obj, true);

这导致:name=John+Doe&courses=1&courses=2&courses=4

调用$.ajax()时,可以将traditional选项设置为true,让jQuery以传统预期的方式对数据进行编码。似乎traditional应该是默认值,因为jQuery的ajax函数默认使用www-form-urlencode内容类型。但是,当数据发送到服务器时,最终结果是格式错误的www-form-urlencode'd数据块(根据HTML表单的一般处理方式,如果它们具有多个具有相同名称的输入)。 p>

此处更新了示例:http://jsfiddle.net/BrHSy/1/