【问题标题】:Pass entire form as data in jQuery Ajax function在 jQuery Ajax 函数中将整个表单作为数据传递
【发布时间】:2011-01-02 10:33:29
【问题描述】:

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

【问题讨论】:

  • Moh 关于 FormData() 和图像是正确的。但要进一步澄清。序列化仅适用于字符串(而非二进制数据)。 FormData() 函数适用于编码类型设置为“multipart/form-data”的表单。详情在这里:developer.mozilla.org/en-US/docs/Web/API/FormData

标签: jquery ajax


【解决方案1】:

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

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

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

【讨论】:

  • $.post 也可以在成功时调用函数。 $.post('url', data, function() { .... });
  • 注意:表单字段必须设置 name 属性,仅使用 ID 不能按文档说明和我第一手发现的那样工作。
  • 我需要一些具有相同 name 的输入吗?我的意思是,就像让它们成排排列一样?我怎样才能以数组或其他方式发送它?
  • @FranciscoCorralesMorales 这样命名您的输入:person[0].firstNameperson[0].lastNameperson[1].firstNameperson[1].lastName
  • @ahmehri,这是一个有效的 HTML <input name="person[1].lastName"> 吗?
【解决方案2】:

serialize() 如果您想使用 post 方法发送表单,这不是一个好主意。例如,如果你想通过 ajax 传递一个文件,它就不会工作。

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

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

    let myform = document.getElementById("myform");
    let 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
        }
    });

【讨论】:

  • 是的,更新的浏览器支持它,但使用序列化你只能传递字符串。
  • 也许你应该在回答中提到这一点
  • 感谢var,2016 年!
  • 你美!像魅力一样工作(表单数据+文件上传)
  • 怎么强调都不过分!尝试了form.serialize(),但它不适用于文件上传。 new FormData(this) 工作得很好
【解决方案3】:

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

请注意,多个

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

希望对您有所帮助。

【讨论】:

【解决方案4】:

使用

serialize( )

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

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

【讨论】:

    【解决方案5】:

    一个很好的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 中的发送函数如下所示:

    $( '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' );
    

    【讨论】:

    • 要从表单的“action”属性中提取 url,请改用url: $(this).attr('action'),
    【解决方案6】:

    您只需发布数据。和使用 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>
    

    【讨论】:

      【解决方案7】:

      其他解决方案对我不起作用。也许我正在处理的项目中的旧 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)
              }
          });
      }
      

      【讨论】:

        猜你喜欢
        • 2011-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-25
        • 1970-01-01
        • 1970-01-01
        • 2015-09-10
        • 2015-06-06
        相关资源
        最近更新 更多