Почему эта точка с запятой появляется, если я использую jQuery serialize () на входах с квадратными скобками в имени? - PullRequest
8 голосов
/ 05 апреля 2011

У меня есть следующий 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[]">  

Я проверяю первые два варианта и отправляю его на сервер через ajax в jQuery:

$.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 показывает мне данные, которыебыло опубликовано:

опции опции% 5B% 5D = опции_1 & опции% 5B% 5D = опции_2
Пока все хорошо.

В myfile.php я получаю POST-переменную следующим образом:

$options = $_POST['options'];

Теперь, когда я отображаю $ options, я получаю это:

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

Где эта точка с запятой передвторая пара скобок взялась?Это сводит меня с ума.

Я уже использовал utf8_decode в данных POST, а также urldecode и rawurldecode .Ничего не меняетсяЯ также избежал квадратных скобок в вызове ajax следующим образом:

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

Это тоже не помогло.Любые идеи кто-нибудь?

Ответы [ 4 ]

2 голосов
/ 18 июля 2012

У меня была именно эта проблема, и я смог заставить ее работать только с помощью ".serializeArray ()", надеюсь, это было то, что вы искали.

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

Для меня этовыводит стандартную строку в том же формате, что и запросы GET.

1 голос
/ 17 декабря 2012

Рекомендую удалить [] из имен html, это плохой дизайн.Может быть проблема на стороне jQuery или PHP тоже.Я не вижу других проблем в вашем коде.

Какие символы разрешены в атрибуте имени HTML?
Какие допустимые значения для атрибута id в HTML?

0 голосов
/ 01 августа 2013

Вы можете прочитать это и попробовать это:

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

или это

$.param(obj, true);

true в$.param указывает, что следует использовать традиционный метод сериализации объекта.Традиционный метод не использует квадратные скобки, когда встречается с тем же именем параметра.

0 голосов
/ 05 апреля 2011

Почему вы используете квадратные скобки [] и одно и то же имя для каждого элемента ввода? Если я вас правильно понял, вы можете сериализовать с помощью элемента обертки.

<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()
},
...