将整个表单作为数据传递到jQuery Ajax函数中


155

我有一个jQuery ajax函数,想提交一个完整的表单作为发布数据。我们正在不断更新表单,因此不断更新应在请求中发送的表单输入变得很乏味。


Moh关于FormData()和图像是正确的。但是要进一步澄清。只是序列化仅适用于字符串(不适用于二进制数据)。FormData()函数可用于将编码类型设置为“ multipart / form-data”的表单。此处的详细信息:developer.mozilla.org/zh-CN/docs/Web/API/FormData
james kenny

Answers:


283

有一个函数可以做到这一点:

http://api.jquery.com/serialize/

var data = $('form').serialize();
$.post('url', data);

3
$ .post也可以在成功时调用一个函数。$ .post('url',data,function(){....});
slm 2012年

22
注意:表单字段必须设置了name属性,仅使用ID不能如文档所述和我第一手发现的那样工作。
Lance Cleveland

什么是我需要用相同的一些输入名字?我是说,喜欢将它们排成一排?如何将其以数组或其他形式发送?
弗朗西斯科·科拉莱斯·莫拉莱斯

2
@FranciscoCorralesMorales用这种方式命名您的输入:person[0].firstName person[0].lastName person[1].firstName person[1].lastName
ahmehri 2015年

@ahmehri,所以这是有效的HTML <input name="person[1].lastName">吗?
弗朗西斯科·科拉莱斯·莫拉莱斯2015年

58

如果要使用post方法发送表单,serialize()并不是一个好主意。例如,如果您想通过ajax传递文件,它将无法正常工作。

假设我们有一个带有此ID的表单:“ myform”。

更好的解决方案是制作一个FormData并将其发送:

    var myform = document.getElementById("myform");
    var fd = new FormData(myform );
    $.ajax({
        url: "example.php",
        data: fd,
        cache: false,
        processData: false,
        contentType: false,
        type: 'POST',
        success: function (dataofconfirm) {
            // do something with the result
        }
    });

1
是的,更新的浏览器支持它,但是使用序列化只能传递字符串。
Moh Arjmandi 2015年

4
也许您应该在回答中提到它
toesslab 2015年

谢谢你们,var在2016年!
锡拉(Sylar)2016年

1
你美丽!就像魅力一样工作(表单数据+文件上传)
saibbyweb

2
不够强调!尝试过,form.serialize()但是它对于文件上传不起作用。new FormData(this)工作得很好
Sasanka Panguluri'Apr 9'18

26

通常serialize()在form元素上使用。

请注意,多个<select>选项在同一键下序列化,例如

<select id="foo" name="foo" multiple="multiple">
    <option value="1">one</option>
    <option value="2">two</option>
    <option value="3">three</option>
</select>

将导致一个查询字符串,其中包含同一查询参数的多次出现:

[path]?foo=1&foo=2&foo=3&someotherparams...

这可能不是您在后端中想要的。

我使用此JS代码将多个参数简化为以逗号分隔的单个键(在John Resig所在的线程中从评论者的响应中无耻地复制):

function compress(data) {
    data = data.replace(/([^&=]+=)([^&]*)(.*?)&\1([^&]*)/g, "$1$2,$4$3");
    return /([^&=]+=).*?&\1/.test(data) ? compress(data) : data;
}

上面的内容变成了:

[path]?foo=1,2,3&someotherparams...

在您的JS代码中,您可以这样称呼它:

var inputs = compress($("#your-form").serialize());

希望有帮助。


如果您使用的是PHP,则使用parse_url函数解析查询字符串很简单:us3.php.net/manual/en/function.parse-url.php
Lobos

我知道这很旧,但是您如何知道使用此方法选择了哪些选项?
yardpenalty.com 2016年

18

序列化()

var str = $("form").serialize();

将表单序列化为查询字符串,该查询字符串可以在Ajax请求中发送到服务器。


3

做到这一点的一个不错的jQuery选项是通过FormData。通过表单发送文件时,此方法也适用!

<form id='test' method='post' enctype='multipart/form-data'>
   <input type='text' name='testinput' id='testinput'>
   <button type='submit'>submit</button>
</form>

您在jQuery中的send函数将如下所示:

$( 'form#test' ).submit( function(){
   var data = new FormData( $( 'form#test' )[ 0 ] );

   $.ajax( {
      processData: false,
      contentType: false,

      data: data,
      dataType: 'json',
      type: $( this ).attr( 'method' );
      url: 'yourapi.php',
      success: function( feedback ){
         console.log( "the feedback from your API: " + feedback );
      }
});

要将数据添加到表单,您可以在表单中使用隐藏的输入,也可以随时添加:

var data = new FormData( $( 'form#test' )[ 0 ] );
data.append( 'command', 'value_for_command' );

2
要从表单的“操作”属性中提取网址,请url: $(this).attr('action'),改用
rubo77 '18

1

您只需要发布数据。并使用jquery ajax函数设置参数。这是一个例子。

<script>
        $(function () {

            $('form').on('submit', function (e) {

                e.preventDefault();

                $.ajax({
                    type: 'post',
                    url: 'your_complete url',
                    data: $('form').serialize(),
                    success: function (response) {
                        //$('form')[0].reset();
                       // $("#feedback").text(response);
                        if(response=="True") {
                            $('form')[0].reset();
                            $("#feedback").text("Your information has been stored.");
                        }
                        else
                            $("#feedback").text(" Some Error has occured Errror !!! ID duplicate");
                    }
                });

            });

        });
    </script>

0

其他解决方案对我不起作用。也许我正在研究的项目中的旧DOCTYPE阻止了HTML5选项。

我的解决方案:

<form id="form_1" action="result.php" method="post"
 onsubmit="sendForm(this.id);return false">
    <input type="hidden" name="something" value="1">
</form>

js:

function sendForm(form_id){
    var form = $('#'+form_id);
    $.ajax({
        type: 'POST',
        url: $(form).attr('action'),
        data: $(form).serialize(),
        success: function(result) {
            console.log(result)
        }
    });
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.