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

Posted

技术标签:

【中文标题】如果输入元素是数组,如何使用 JQuery 发送序列化表单数据【英文标题】:How to send serialize form data using JQuery if the input element is an array 【发布时间】:2010-09-23 04:50:50 【问题描述】:

我的 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】:

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

【讨论】:

好主意,除了应该是 serialize().replace(/%5B%5D/g, '[]'); (因为如果不是带全局属性的正则表达式,只会替换第一个匹配项。) 不想浪费你的时间,你应该记住删除正则表达式周围的单引号:))【参考方案2】:

我想出了一个方法,当使用 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;

【讨论】:

【参考方案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】:

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() ) );" ...>
...

【讨论】:

这一切都很好,但问题是您通过 $.serialize 将表单元素传递给您的函数,这将重新排列我们不想替换的东西,即使我没有看过在源代码中,我认为序列化无论如何都会做这一切,但它会做一些我们不希望它做的额外事情,比如替换'['和']'【参考方案5】:

@托马拉克 您可以在 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>');

输出 =>

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

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

【讨论】:

【参考方案8】:

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

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

【讨论】:

我认为 serialize() 在从表单应用于包装集时,会返回正确编码的字符串。 是的。刚刚测试过了。固定。 我不确定选择器是否最佳。它不应该只是“表格”或“#bookform”吗?我认为只使用“#id”会更快,但在其他方面相当于“element#id”。 哦,您的代码末尾有一个多余的分号。修复后删除该评论即可。【参考方案9】:

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

在 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'] 的值是一个数组。耶!耶!

我确实希望并且希望 JQuery 的 $.post 方法能够像 Prototype 一样支持数组数据类型。 :)

【讨论】:

这不是 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); , 错误:function() $("#save-result").append("处理过程中发生错误"); );【参考方案10】:
var data = $(form).serialize();
$.post('post.php', '&'+data);

【讨论】:

+1:如果这只是使用 .post() 等提交,虽然文档显示它使用 JSON 化数据,但它也将接受序列化数据:参见 @987654321 @【参考方案11】:

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

但是你真正需要做的就是在序列化它们之后将'[' & ']' 替换回它们自己。因为序列化();将它们更改为它们的 htmlencoded 值!

【讨论】:

我不知道 [ 和 ] 的等价物,否则我会为你做,只需找出并使用 jQuery 的 .replace() 函数。【参考方案12】:

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

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

说明:

选择器^=选择name属性值以'bookArray'开头的所有元素,左方括号'['确保元素是我们要序列化的数组,而不仅仅是以字符串'bookArray'开头的变量'。

【讨论】:

【参考方案13】:

你必须用这个替换左方括号和右方括号:

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

【讨论】:

【参考方案14】:

感谢托马拉克。

在 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(); 警报(选定的书籍);

从警报消息框中,我得到 ==> 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 代码可以正常工作。

当我做原型时 echo $selectedBookId;

我得到了数组。

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

我得到了 ==> bookArray%5B%5D=T4.11&bookArray%5B%5D=T4.38

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

【讨论】:

您错过了重点:您没有向服务器发送数组。 HTTP Posts 不能这样工作。您发送一个逗号分隔的值列表:$selectedBookId 类似于“1,2,3,4,5”。要再次创建数组,请使用: $selectedBooks = explode("," $selectedBookId); 顺便说一句:您的 PHP 中仍然有“name='bookArray[]'”,这只是 HTML 中的错误。将其更改为简单的“name='books'”。正如我所说,HTML 中没有表单值数组这样的东西。 您真的应该在 PHP 中更频繁地使用 var_dump()。您会立即发现您并没有首先处理数组。 @Tomalak: PHP 需要varname[] 来处理作为数组服务器端的复选框组(或任何输入)。

以上是关于如果输入元素是数组,如何使用 JQuery 发送序列化表单数据的主要内容,如果未能解决你的问题,请参考以下文章

如何获取输入数组元素jquery的所有值[重复]

剑指——二叉搜索树的后序遍历

如何将多个元素插入到 JQuery 中的数组中?

如何使用jQuery从数组中的元素中检索值?

二叉搜索树的后序遍历序列

二叉搜索树的后序遍历序列