在使用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
答案 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的单选按钮,但名称相同。提交时,响应中只有一个值。
因此请注意表格中有唯一的名称。