如果我在名称中带有方括号的输入上使用jQuery serialize(),为什么会出现这个分号?


Why does this semicolon appear if I use jQuery serialize() on inputs with square brackets in the name?

我有以下HTML:

<input type="checkbox" id="options_1" value="options_1" name="options[]">  
<input type="checkbox" id="options_2" value="options_2" name="options[]">  
<input type="checkbox" id="options_3" value="options_3" name="options[]">  

我检查前两个选项,并通过jQuery中的ajax将其发送到服务器:

$.ajax({
    type: "POST",
    url: "myfile.php",
    data: {
        'options':$('input[name="options[]"]').serialize()
    },
    dataType: 'json',
    beforeSend: function(){
           //do some stuff
    },
    success: function(msg){
        //do some stuff
    }
});

Firebug显示已经发布的数据:

选项> <我>选择% 5 b % 5 d = options_1&选择% 5 b % 5 d = options_2
到目前为止,一切顺利。

在myfile.php中,post变量如下所示:
$options = $_POST['options'];

现在,当我回显$options时,我得到这个:

"options[]=options_1&options;[]=options_2"

第二对括号前面的分号是从哪里来的?这快把我逼疯了。

我已经对POST数据使用了utf8_decode以及urldecoderawurldecode。没有什么变化。我还像这样转义了ajax调用中的方括号:

data: {
    'options':$('input[name="options''['']"]').serialize()
},

那也没用。有什么想法吗?

我有这个确切的问题,我只能通过使用". serializearray()"来让它工作,我希望这是你正在寻找的。

data: {
    'options':$('input[name="options[]"]').serializeArray()
},

对于我来说,这输出与GET请求相同格式的标准字符串。

我建议从html名称中删除[],这是糟糕的设计。在jQuery或PHP方面也可能存在问题。我看不出你的代码有其他问题。

HTML Name属性中允许使用哪些字符?
HTML中id属性的有效值是什么?

为什么每个输入元素都使用括号[]和相同的名称?如果我说对了,你可以通过换行元素序列化。

<form id="options">
    <input type="checkbox" id="options_1" value="options_1" name="option1" />  
    <input type="checkbox" id="options_2" value="options_2" name="option2" />  
    <input type="checkbox" id="options_3" value="options_3" name="option3" />  
</form>

你可以序列化成

data: {
    'options':$('#options').serialize()
},

您可能想要读取this并尝试如下:

data: {
        'options':$('input[name="options[]"]').replace('%5B%5D', '[]') 
    },

$.param(obj, true);

$.param中的true表示应该使用传统的序列化对象的方法。传统方法在遇到相同的参数名时不使用方括号。