Как отправить данные о форме сериализации с помощью JQuery, если входной элемент является массивом

У меня есть эта часть кода в моем PHP-коде:

while ($row = mysqli_fetch_assoc($result)) { extract($row); echo "<tr>"; echo "<td bgcolor='#FFFFFF'><input id='bookArray[]' name='bookArray[]' type='checkbox' value='$book_id' />$book_id</td>"; echo "<td bgcolor='#FFFFFF'>$threat_name</td>"; echo "</tr>"; } 

В HTML-странице я хочу использовать метод jQuery serialize () для отправки массива выбранных книг в bookArray []. В моем JavaScript,

 var selectedbooks = $("book_form").serialize(); alert (selectedbooks); 

В окне предупреждений я не получил никакого значения (пустая строка).

Раньше, когда я использовал Prototype, он работал хорошо.

easy: serialize().replace(/%5B%5D/g, '[]')

Я придумал метод, который будет, когда данные будут отправлены с использованием сообщения

с другой стороны позволяет вам обращаться к вашим элементам с помощью $_['post']['name']

Если это массив (например, множественный выбор), то на вашем сервере вы можете снова получить его как массив $_POST['myselect'][0]...

Код: Функция для сериализации данных формы для публикации

 function serializePost(form) { var data = {}; form = $(form).serializeArray(); for (var i = form.length; i--;) { var name = form[i].name; var value = form[i].value; var index = name.indexOf('[]'); if (index > -1) { name = name.substring(0, index); if (!(name in data)) { data[name] = []; } data[name].push(value); } else data[name] = value; } return data; } 
 var arTags = new Array(); jQuery.map( $("input[name='tags[]']") , function(obj,index) { arTags .push($(obj).val()); }); var obj = {'new_tags' : $("#interest").val() , 'allready_tags[]' : arTags }; var post_data = jQuery.param(obj,true); $.ajax({ type : 'POST', url : 'some_url', data : post_data, dataType : "html", success: function(htmlResponse) { } }); 

Прототип / Scriptaculous функции сериализации для jQuery:

 <script> function toObjectMap( queryString ) { return '{\'' + queryString.replace(/=/g, '\':\'').replace(/&/g, '\',\'') + '\'}'; } </script> ... <div id="result"></div> ... <form onSubmit="$('#result').load( ajaxURL, toObjectMap( $('#formId').serialize() ) );" ...> ... 

@Tomalak Вы можете использовать символы квадратных скобок «[» и «]» в XHTML, см. http://www.w3.org/TR/xhtml1/dtds.html#dtdentry_xhtml1-transitional.dtd_input

Таким образом, это означает, что имя может содержать много разных символов юридически в XHTML, хотя не имеет смысла использовать слэши или скобки. PHP поддерживает использование нотации массива в именах форм, поэтому вам может не хватать трюк, если вы не используете обозначения массива в некоторых случаях.

jQuery 1.4

 var myform = $("book_form").serialize(); decodeURIComponent(myform); 

правильно работать jquery =>

 var data = $('form').serialize(); $.post(baseUrl+'/ajax.php', {action:'saveData',data:data}, function( data ) { alert(data); }); 

php =>

 parse_str($_POST['data'], $searcharray); echo ('<PRE>');print_r($searcharray);echo ('</PRE>'); 

output =>

 [query] => [search_type] => 0 [motive_note] => [id_state] => 1 [sel_status] => Array ( [8] => 0 [7] => 1 ) 

и вы можете делать все, что хотите, с данными массива, благодаря Aridane https://stackoverflow.com/questions/1792603

Возможно, вам придется изменить свой PHP, как предлагает @Tomalak, но вам также нужно будет изменить свой javascript. Для ссылки на именованный элемент используйте селектор #name:

 var selectedbooks = $('form#book_form').serialize();; 

Задача решена! Вот что я сделал.

Внутри файла PHP для создания строк динамических флажков,

  while ($row = mysqli_fetch_assoc($result)) { extract($row); echo "<tr>"; echo "<td bgcolor='#FFFFFF'><input name='books' type='checkbox' value='$book_id' />$book_id</td>"; echo "<td bgcolor='#FFFFFF'>$book_name</td>"; echo "</tr>"; } // while 

Я больше не использую метод JQuery $ .post. Я изменил свой код на следующий

  var my_query_str = ''; $("input[@type='checkbox'][@name='books']").each( function() { if(this.checked) { my_query_str += "&bookArray[]=" + this.value; } }); $.ajax( { type: "POST", url: "saveBookList.php", data: "dummy_data=a" + my_query_str, success: function(responseData) { $("#save-result").empty().append(responseData); }, error: function() { $("#save-result").append("An error occured during processing"); } }); 

Теперь, на странице savebookList.php, значение $ _POST ['bookArray'] является массивом. Yey! Yey!

Я надеюсь и хочу, чтобы метод $ .post JQuery мог поддерживать тип данных массива, как это делает Prototype. 🙂

 var data = $(form).serialize(); $.post('post.php', '&'+data); 

это не проблема с jQuery Post, это с сериализацией, вы можете это сделать:

  var my_query_str = ''; $("input[@type='checkbox'][@name='books']").each( function() { if(this.checked) { my_query_str += "&bookArray[]=" + this.value; } }); jQuery.post( "saveBookList.php", "dummy_data=a" + my_query_str , function(responseData){ $("#save-result").empty().append(responseData); }, error: function() { $("#save-result").append("An error occured during processing"); } }); 

но все, что вам действительно нужно сделать, это заменить '[' & ']' на себя после их сериализации. потому что serialize (); изменили их на их htmlencoded значение!

Если вам нужно разместить только этот массив, а не другие поля ввода, это чистое и быстрое решение:

 var selectedbooks = $('book_form input[name^="bookArray["]').serialize(); alert (selectedbooks); 

Explaination:

Селектор ^ = выбирает все элементы со значением атрибута имени, начиная с «bookArray», открытой квадратной скобки «[» гарантирует, что этот элемент является массивом, который мы хотим сериализовать, а не просто переменной, начинающейся со строки «bookArray».

Вы должны заменить левые квадратные скобки и прямоугольные скобки следующим образом:

 data: $(this).serialize().replace(/%5B/g, '[').replace(/%5D/g, ']'), 

Спасибо Томалаку.

В PHP-файле я использую следующий код:

 while ($row = mysqli_fetch_assoc($result)) { extract($row); echo "<tr>"; echo "<td bgcolor='#FFFFFF'><input id='$book_id' name='bookArray[]' type='checkbox' value='$book_id' />$book_id</td>"; echo "<td bgcolor='#FFFFFF'>$book_name</td>"; echo "</tr>"; } // while 

** Book_id уникален.

Используя решение tvanfosson, теперь я могу получить массив входного значения

var selectedBooks = $ ('form # book_form'). serialize (); alert (selectedBooks);

Из окна сообщения для предупреждения я получаю ==> bookArray% 5B% 5D = T2.05 и bookArray% 5B% 5D = T2.81

Теперь, когда я отправил значение ввода сериализации в файл PHP, используя JQuery

 var selectedBooks = $('form#book_form').serialize(); alert (selectedBooks); var url = 'saveBookList.php'; // Send to server using JQuery $.post(url, {bookArray: selectedBooks}, function(responseData) { $("#save-result").text(responseData); }); 

Внутри saveBookList.php для обработки формы сериализации я получил эту ошибку «Недопустимый аргумент, предоставленный foreach ()».

Внутри saveBookList.php,

 // If you have selected from list box. if(isset($_POST['bookArray'])) { // Get array or bookID selected by user $selectedBookId = $_POST['bookArray']; echo $selectedBookId; foreach($selectedBookId as $selectListItem) { echo "You sent this -->" . $selectListItem . "\n"; } } 

PHP-код выше работает отлично, если я отправляю с использованием Prototype.

Для Prototype, когда я делаю echo $ selectedBookId;

Я получил Массив.

Для JQuery, когда я делаю echo $ selectedBookId;

Я получил ==> bookArray% 5B% 5D = T4.11 и bookArray% 5B% 5D = T4.38

Мой вопрос, поддерживает ли значение jQuery значение массива для метода post?