如果input元素是一个数组,如何使用JQuery发送序列化表单数据

时间:2008-11-20 06:53:50

标签: php 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时,它运作良好。

14 个答案:

答案 0 :(得分:22)

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

答案 1 :(得分:9)

我提出了一种方法,当使用post

发送数据时 另一方面,

可让您使用$_['post']['name']

访问元素

如果它是一个数组(例如多选),那么在您的服务器上,您可以再次将其作为数组访问$_POST['myselect'][0]...

代码: Function to serialize form data for post

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;
}

答案 2 :(得分:2)

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

      }
});

答案 3 :(得分:1)

jQuery的原型/ Scriptaculous序列化功能:

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

答案 4 :(得分:1)

@Tomalak 您可以在XHTML中使用方括号字符“[”和“]” 看到 http://www.w3.org/TR/xhtml1/dtds.html#dtdentry_xhtml1-transitional.dtd_input

所以这意味着名称可以在XHTML中合法地包含许多不同的字符,尽管使用斜杠或括号没有多大意义。 PHP支持在表单名称中使用数组表示法,因此如果在某些情况下不使用数组表示法,则可能会丢失技巧。

答案 5 :(得分:1)

jQuery 1.4

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

decodeURIComponent(myform);

答案 6 :(得分:1)

正常工作 jquery =&gt;

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

php =&gt;

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

output =&gt;

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

你可以用数组数据做任何你想做的事情, 感谢Aridane https://stackoverflow.com/questions/1792603

答案 7 :(得分:0)

您可能需要更改PHP,因为@Tomalak建议,但您还需要更改您的JavaScript。要引用命名元素,请使用#name选择器:

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

答案 8 :(得分:0)

感谢Tomalak。

在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);

在提醒消息框中,我得到==&gt; bookArray%5B%5D = T2.05&安培; bookArray%5B%5D = T2.81

现在,当我使用JQuery将序列化输入值发送到PHP文件时

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";
    }
}

如果我使用Prototype发送,上面的PHP代码工作正常。

对于Prototype,当我这样做     echo $ selectedBookId;

我得到了数组。

对于JQuery,当我这样做    echo $ selectedBookId;

我得到==&gt;    bookArray%5B%5D = T4.11&安培; bookArray%5B%5D = T4.38

我的问题,jQuery是否支持post方法的数组值?

答案 9 :(得分:0)

问题解决了!这就是我所做的。

在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!

我希望并希望JQuery的$ .post方法可以像Prototype那样支持数组数据类型。 :)

答案 10 :(得分:0)

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

答案 11 :(得分:0)

这不是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"); 
       }
   }); 

但你真正需要做的就是替换'['&amp; '''序列化后回到自己身边。因为serialize();将它们改为htmlencoded值!

答案 12 :(得分:0)

如果您只需要发布该数组而不是其他输入字段,这是一个干净而快速的解决方案:

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

阐释:

选择器^ =选择名称属性值以&#39; bookArray&#39;开放方括号&#39; [&#39;确保元素是我们想要序列化的数组,而不仅仅是以字符串&#39; bookArray&#39;开头的变量。

答案 13 :(得分:0)

您必须将左方括号和右方括号替换为:

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