Как отправить данные о форме сериализации с помощью 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, он работал красиво.

Ответы

Ответ 1

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

Ответ 2

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

с другой стороны позволяет вам обращаться к вашим элементам с помощью $_['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;
}

Ответ 3

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)
      {

      }
});

Ответ 4

Прототип/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() ) );" ...>
...

Ответ 5

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

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

Ответ 6

jQuery 1.4

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

decodeURIComponent(myform);

Ответ 7

правильно работать 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
    )

и вы можете делать все, что хотите, с данными массива, благодаря fooobar.com/questions/48241/...

Ответ 8

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

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

Ответ 9

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

В 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 для обработки формы сериализации, я получил эту ошибку Msgstr "Недопустимый аргумент для 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.

Для прототипа, когда я делаю   echo $selectedBookId;

Я получил Array.

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

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

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

Ответ 10

Проблема решена! Вот что я сделал.

Внутри 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.:)

Ответ 11

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

Ответ 12

Это не проблема с 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 значение!

Ответ 13

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

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

Explaination:

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

Ответ 14

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

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