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

Bri*_*ian 141 ajax jquery

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

Wil*_*den 265

有一个函数正是这样做的:

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

var data = $('form').serialize();
$.post('url', data);
Run Code Online (Sandbox Code Playgroud)

  • 注意:表单字段必须具有name属性集,仅使用ID不能像记录的那样工作,而且我发现第一手资料. (20认同)
  • $ .post也可以在成功时调用函数.$ .post('url',data,function(){....}); (3认同)
  • @FranciscoCorralesMorales就像这样命名你的输入:`person [0] .firstName``person [0] .lastName``person [1] .firstName``person [1] .lastName` (2认同)

Moh*_*ndi 52

如果要使用post方法发送表单,serialize()不是一个好主意.例如,如果你想通过ajax传递一个文件,那就不行了.

更好的解决方案是制作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
        }
    });
Run Code Online (Sandbox Code Playgroud)

  • 也许你应该在答案中提到这一点 (4认同)
  • 不能强调这一点!尝试`form.serialize()`但它只是不适用于文件上传.`new FormData(this)`工作得很好 (2认同)

nik*_*ola 25

一般用serialize()在表单元素上.

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

<select id="foo" name="foo" multiple="multiple">
    <option value="1">one</option>
    <option value="2">two</option>
    <option value="3">three</option>
</select>
Run Code Online (Sandbox Code Playgroud)

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

[path]?foo=1&foo=2&foo=3&someotherparams...
Run Code Online (Sandbox Code Playgroud)

这可能不是你想要的后端.

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

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

这将以上变为:

[path]?foo=1,2,3&someotherparams...
Run Code Online (Sandbox Code Playgroud)

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

var inputs = compress($("#your-form").serialize());
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.


rah*_*hul 16

使用

serialize()

var str = $("form").serialize();
Run Code Online (Sandbox Code Playgroud)

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


pat*_*ick 6

执行此操作的一个很好的 jQuery 选项是通过FormData。这种方法也适用于通过表单发送文件!

<form id='test' method='post' enctype='multipart/form-data'>
   <input type='text' name='testinput' id='testinput'>
   <button type='submit'>submit</button>
</form>
Run Code Online (Sandbox Code Playgroud)

您在 jQuery 中的发送函数如下所示:

$( '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 );
      }
});
Run Code Online (Sandbox Code Playgroud)

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

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

  • 要从表单的“action”属性中提取 url,请使用 `url: $(this).attr('action'),` 代替 (2认同)