0

我在使用 序列化表单后得到这个输出serialize()

cambio_estado_factura%5Bestado%5D=1

正如文档所说,我期望这种格式的东西:

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

4

3 回答 3

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

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

于 2012-09-05T11:30:29.763 回答
0

该字符串已被编码。

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

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

cambio_estado_factura[5Bestado] = 1

这与URL 编码相同,它是将内容传输到 URL 的安全方式。这也是预期的方式。

于 2012-09-05T11:32:45.340 回答
0

它采用name输入,这name="cambio_estado_factura[estado]"也是,由于两个输入控件共享相同的名称,表单将只提交一个。

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

所以要小心在表单中使用唯一的名称。

于 2012-09-05T11:33:04.100 回答