首页 文章

如何使用Jquery的AJAX提交复杂的表单?

提问于
浏览
3

我正在尝试使用Jquery的ajax提交表单 . 它有一些文本框,一些复选框和一个多选项的下拉列表(即可以选择多个选项) .

这里有人告诉我,我可以使用所有选中的复选框的值

$("input:checkbox[name=type]:checked")

然后我可以遍历上面代码返回的所有值,将它们分配给这样的数组:

var types=new Array();

    $.each(cboxes, function()
      {
         types[types.length]=$(this).val();
      }
    );

并尝试使用以下方式提交表单:

var someField=$("#someField").val();
var someField2=$("#someField2").val();
var data={field1 : someField, field2=someField2, s_types:types};
$.post("signup.php?type=p",types);

但这不起作用,特别是复选框无法正确提交 . 我怎样才能使它工作?

3 回答

  • 2

    没有必要迭代每个字段来获取表单值 . jQuery有一个方法将表单输入序列化为查询字符串 . 你可以这样做:

    $.ajax({
      url: "mybackend.php",
      data: $("#myForm").serialize(),
      success: function(e) { // do something on success },
      error: function(e) { // do something on error }
    });
    

    请记住,javascript帖子总是以UTF-8格式发送数据,因此如果您计划发送带有国际字符的文本,请确保在后端期望这样做 .

  • 5

    我建议使用插件来做到这一点 . 看看这个form plug-in . 它也可以很好地与validation plug-in集成 .

  • 13

    默认的jQuery $.param不处理数组(by design),因此你不能使用$ .serialize . 使用插件,如kgiannakis' answer中建议的那样,或覆盖$ .param函数,以便它正确处理数组:

    function($) {
      $.param = function(a) {
        var s = [];
        if (a.constructor == Array || a.jquery) 
          jQuery.each(a, function() { s.push( encodeURIComponent(this.name) + "=" + encodeURIComponent( this.value ) ); });
        else
          for (var j in a)
            if (a[j] && a[j].constructor == Array) jQuery.each( a[j], function(){ s.push( encodeURIComponent(j) + "[]=" + encodeURIComponent( this ) ); });
            else s.push(encodeURIComponent(j) + "=" + encodeURIComponent(a[j]));
        return s.join("&").replace(/%20/g, "+");
      };
    })(jQuery);
    

    ...然后使用$ .serialize,如Danita所示 .

相关问题