jQuery:关于serialize()的输出

时间:2012-09-05 11:22:41

标签: jquery

在使用serialize()序列化表单后,我收到了此输出。

cambio_estado_factura%5Bestado%5D=1

正如doc所说,我期待这种格式的东西:

a=1&b=2&c=3&d=4&e=5

这是我正在序列化的形式:

<form id="cambio_estado" action="">
    <div class="fld ">
        <label for="cambio_estado_factura_estado">Estado</label>
        <ul class="radio_list">
            <li>
                <input name="cambio_estado_factura[estado]" type="radio" value="1" id="cambio_estado_factura_estado_1">
                <label for="cambio_estado_factura_estado_1">Recibida</label>
            </li>
            <li>
                <input name="cambio_estado_factura[estado]" type="radio" value="2" id="cambio_estado_factura_estado_2">
                <label for="cambio_estado_factura_estado_2">Registrada</label>
            </li>
        </div>
    <input id="cambio_estado" type="submit" value="Cambiar">
</form>

这是jquery代码:

$('form#cambio_estado').submit(function(e){
    e.preventDefault();
    alert();
    console.log($('form#cambio_estado'));
    var datos_formulario = $('form#cambio_estado').serialize();
    console.log(datos_formulario);
    $.post($("section#consultarFactura").data("url-cambio-estado"),
        {"cambio_estado_factura": datos_formulario }
    );

});

有什么想法吗?

jQuery 1.6.1

3 个答案:

答案 0 :(得分:2)

这实际上是serialize()的正确行为。

您的问题是表单中的名称是cambio_estado_factura[estado]。这实际上会转换为cambio_estado_factura%5Bestado%5D,这是元素的转义名称。 Serialize()将使用您在表单上为每个元素使用的名称。如果要在生成的查询字符串上显示不同的名称,请在表单上使用相应的名称。

示例 - 此表单会在调用a=1&a=2时返回serialize()

<form>
    <input type="text" name="a" value="1" />
    <input type="text" name="b" value="2" />
</form>

编辑:

参考您的评论,这是我parse_str的例子:

parse_str('cambio_estado_factura%5Bestado%5D=1', $arr);
var_dump($arr);
echo $arr["cambio_estado_factura"]["estado"] == 1 ? "Value set" : "Value not set";

返回:

array
 'cambio_estado_factura' => 
    array
      'estado' => string '1' (length=1)

Value set

这意味着您假设您的阵列是单级的,而实际上它是多级的。

答案 1 :(得分:0)

字符串已编码。

%20 is space
%5B is '['
and %5D is ']'

由于您已将cambio_estado_factura[5Bestado]作为数组,因此它传递的最终输出只有一个参数:

cambio_estado_factura[5Bestado] = 1

这与URL Encoding相同,是将内容传输到网址的安全方式。这也是预期的方式。

答案 2 :(得分:0)

它接受name输入,也是name="cambio_estado_factura[estado]",因为两个输入控件共享相同的名称,表单只提交一个。

  

在表单提交中发送数据时使用该名称。不同控制的反应不同。例如,您可能有几个具有不同ID的单选按钮,但名称相同。提交时,响应中只有一个值。

因此请注意表格中有唯一的名称。