【问题标题】:jQuery AJAX submit formjQuery AJAX 提交表单
【发布时间】:2021-09-30 08:09:17
【问题描述】:

我有一个名为 orderproductForm 的表单和未定义的输入数。

我想做某种 jQuery.get 或 ajax 或任何类似的东西,通过 Ajax 调用页面,并发送orderproductForm 形式的所有输入。

我想一种方法是做类似的事情

jQuery.get("myurl",
          {action : document.orderproductForm.action.value,
           cartproductid : document.orderproductForm.cartproductid.value,
           productid : document.orderproductForm.productid.value,
           ...

但是,我并不完全了解所有表单输入。是否有一个特性、功能或其他东西可以发送所有表单输入?

【问题讨论】:

    标签: javascript jquery ajax submit forms


    【解决方案1】:

    这是一个简单的参考:

    // this is the id of the form
    $("#idForm").submit(function(e) {
    
        e.preventDefault(); // avoid to execute the actual submit of the form.
    
        var form = $(this);
        var actionUrl = form.attr('action');
        
        $.ajax({
            type: "POST",
            url: actionUrl,
            data: form.serialize(), // serializes the form's elements.
            success: function(data)
            {
              alert(data); // show response from the php script.
            }
        });
        
    });
    

    【讨论】:

    • 但是form.serialize()不能在IE中发布
    • 被调用的 url 可以来自“http”还是必须是本地的?你的例子: var url = "path/to/your/script.php";
    • 我在寻找相同的解决方案时找到了这个答案,看起来 form.serializeArray() 是另一个不错的选择。 api.jquery.com/serializeArray/#serializeArray
    【解决方案2】:

    您可以使用来自Ajax Form Plugin 的 ajaxForm/ajaxSubmit 函数或 jQuery 序列化函数。

    AjaxForm

    $("#theForm").ajaxForm({url: 'server.php', type: 'post'})
    

    $("#theForm").ajaxSubmit({url: 'server.php', type: 'post'})
    

    ajaxForm 将在提交按钮被按下时发送。 ajaxSubmit 立即发送。

    序列化

    $.get('server.php?' + $('#theForm').serialize())
    
    $.post('server.php', $('#theForm').serialize())
    

    AJAX serialization documentation is here.

    【讨论】:

    【解决方案3】:

    使用在表单元素上定义的属性的另一个类似解决方案:

    <form id="contactForm1" action="/your_url" method="post">
        <!-- Form input fields here (do not forget your name attributes). -->
    </form>
    
    <script type="text/javascript">
        var frm = $('#contactForm1');
    
        frm.submit(function (e) {
    
            e.preventDefault();
    
            $.ajax({
                type: frm.attr('method'),
                url: frm.attr('action'),
                data: frm.serialize(),
                success: function (data) {
                    console.log('Submission was successful.');
                    console.log(data);
                },
                error: function (data) {
                    console.log('An error occurred.');
                    console.log(data);
                },
            });
        });
    </script>
    

    【讨论】:

    • 很好的解决方案。
    【解决方案4】:

    您需要牢记几件事。

    1.提交表单的方法有多种

    • 使用提交按钮
    • 按回车键
    • 通过在 JavaScript 中触发提交事件
    • 可能更多取决于设备或未来的设备。

    因此我们应该绑定到表单提交事件,而不是按钮点击事件。这将确保我们的代码现在和将来适用于所有设备和辅助技术。

    2。盖头

    用户可能没有启用 JavaScript。 hijax 模式在这里很不错,我们使用 JavaScript 轻轻地控制表单,但如果 JavaScript 失败,则让它可提交。

    我们应该从表​​单中提取 URL 和方法,所以如果 HTML 发生变化,我们不需要更新 JavaScript。

    3.不显眼的 JavaScript

    使用 event.preventDefault() 而不是 return false 是一种很好的做法,因为它允许事件冒泡。这可以让其他脚本与事件相关联,例如可能正在监视用户交互的分析脚本。

    速度

    理想情况下,我们应该使用外部脚本,而不是内联插入我们的脚本。我们可以使用脚本标签在页面的头部链接到它,或者在页面底部链接到它以加快速度。脚本应该悄悄地增强用户体验,而不是妨碍。

    代码

    假设您同意上述所有内容,并且您希望捕获提交事件,并通过 AJAX(hijax 模式)处理它,您可以执行以下操作:

    $(function() {
      $('form.my_form').submit(function(event) {
        event.preventDefault(); // Prevent the form from submitting via the browser
        var form = $(this);
        $.ajax({
          type: form.attr('method'),
          url: form.attr('action'),
          data: form.serialize()
        }).done(function(data) {
          // Optionally alert the user of success here...
        }).fail(function(data) {
          // Optionally alert the user of an error here...
        });
      });
    });
    

    您可以随时通过 JavaScript 手动触发表单提交:

    $(function() {
      $('form.my_form').trigger('submit');
    });
    

    编辑:

    我最近不得不这样做并最终编写了一个插件。

    (function($) {
      $.fn.autosubmit = function() {
        this.submit(function(event) {
          event.preventDefault();
          var form = $(this);
          $.ajax({
            type: form.attr('method'),
            url: form.attr('action'),
            data: form.serialize()
          }).done(function(data) {
            // Optionally alert the user of success here...
          }).fail(function(data) {
            // Optionally alert the user of an error here...
          });
        });
        return this;
      }
    })(jQuery)
    

    将 data-autosubmit 属性添加到您的表单标签,然后您可以这样做:

    HTML

    <form action="/blah" method="post" data-autosubmit>
      <!-- Form goes here -->
    </form>
    

    JS

    $(function() {
      $('form[data-autosubmit]').autosubmit();
    });
    

    【讨论】:

      【解决方案5】:

      您也可以使用 FormData(但在 IE 中不可用):

      var formData = new FormData(document.getElementsByName('yourForm')[0]);// yourForm: form selector        
      $.ajax({
          type: "POST",
          url: "yourURL",// where you wanna post
          data: formData,
          processData: false,
          contentType: false,
          error: function(jqXHR, textStatus, errorMessage) {
              console.log(errorMessage); // Optional
          },
          success: function(data) {console.log(data)} 
      });
      

      这就是你使用FormData的方式。

      【讨论】:

      【解决方案6】:

      简单版(不发送图片)

      <form action="/my/ajax/url" class="my-form">
      ...
      </form>
      <script>
          (function($){
              $("body").on("submit", ".my-form", function(e){
                  e.preventDefault();
                  var form = $(e.target);
                  $.post( form.attr("action"), form.serialize(), function(res){
                      console.log(res);
                  });
              });
          )(jQuery);
      </script>
      

      复制并粘贴一个表单或页面上所有表单的 ajaxification

      Alfrekjv's答案的修改版

      • 它适用于 jQuery >= 1.3.2
      • 您可以在文档准备好之前运行它
      • 您可以删除并重新添加表单,它仍然可以工作
      • 它将发布到与普通表单相同的位置,在 表单的“action”属性

      JavaScript

      jQuery(document).submit(function(e){
          var form = jQuery(e.target);
          if(form.is("#form-id")){ // check if this is the form that you want (delete this check to apply this to all forms)
              e.preventDefault();
              jQuery.ajax({
                  type: "POST",
                  url: form.attr("action"), 
                  data: form.serialize(), // serializes the form's elements.
                  success: function(data) {
                      console.log(data); // show response from the php script. (use the developer toolbar console, firefox firebug or chrome inspector console)
                  }
              });
          }
      });
      

      我想编辑 Alfrekjv 的答案,但偏离了太多,因此决定将其作为单独的答案发布。

      不发送文件,不支持按钮,例如单击按钮(包括提交按钮)将其值作为表单数据发送,但由于这是一个 ajax 请求,因此不会发送按钮单击。

      要支持按钮,您可以捕获实际的按钮点击而不是提交。

      jQuery(document).click(function(e){
          var self = jQuery(e.target);
          if(self.is("#form-id input[type=submit], #form-id input[type=button], #form-id button")){
              e.preventDefault();
              var form = self.closest('form'), formdata = form.serialize();
              //add the clicked button to the form data
              if(self.attr('name')){
                  formdata += (formdata!=='')? '&':'';
                  formdata += self.attr('name') + '=' + ((self.is('button'))? self.html(): self.val());
              }
              jQuery.ajax({
                  type: "POST",
                  url: form.attr("action"), 
                  data: formdata, 
                  success: function(data) {
                      console.log(data);
                  }
              });
          }
      });
      

      在服务器端你可以 detect an ajax request 使用 jquery 设置的这个标头 HTTP_X_REQUESTED_WITH 对于php

      PHP

      if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
          //is ajax
      }
      

      【讨论】:

        【解决方案7】:

        此代码即使在文件输入的情况下也能正常工作

        $(document).on("submit", "form", function(event)
        {
            event.preventDefault();        
            $.ajax({
                url: $(this).attr("action"),
                type: $(this).attr("method"),
                dataType: "JSON",
                data: new FormData(this),
                processData: false,
                contentType: false,
                success: function (data, status)
                {
        
                },
                error: function (xhr, desc, err)
                {
        
        
                }
            });        
        });
        

        【讨论】:

        【解决方案8】:

        我真的很喜欢superluminarythis answer,尤其是他的包装方式是jQuery 插件中的解决方案。所以感谢superluminary 提供了一个非常有用的答案。不过,就我而言,我想要一个插件,它允许我在插件初始化时通过选项定义 successerror 事件处理程序。

        这就是我想出的:

        ;(function(defaults, $, undefined) {
            var getSubmitHandler = function(onsubmit, success, error) {
                return function(event) {
                    if (typeof onsubmit === 'function') {
                        onsubmit.call(this, event);
                    }
                    var form = $(this);
                    $.ajax({
                        type: form.attr('method'),
                        url: form.attr('action'),
                        data: form.serialize()
                    }).done(function() {
                        if (typeof success === 'function') {
                            success.apply(this, arguments);
                        }
                    }).fail(function() {
                        if (typeof error === 'function') {
                            error.apply(this, arguments);
                        }
                    });
                    event.preventDefault();
                };
            };
            $.fn.extend({
                // Usage:
                // jQuery(selector).ajaxForm({ 
                //                              onsubmit:function() {},
                //                              success:function() {}, 
                //                              error: function() {} 
                //                           });
                ajaxForm : function(options) {
                    options = $.extend({}, defaults, options);
                    return $(this).each(function() {
                        $(this).submit(getSubmitHandler(options['onsubmit'], options['success'], options['error']));
                    });
                }
            });
        })({}, jQuery);
        

        这个插件让我可以非常轻松地在页面上“ajaxify”html 表单,并提供 onsubmitsuccesserror 事件处理程序来实现向用户反馈表单提交的状态。这允许插件按如下方式使用:

         $('form').ajaxForm({
              onsubmit: function(event) {
                  // User submitted the form
              },
              success: function(data, textStatus, jqXHR) {
                  // The form was successfully submitted
              },
              error: function(jqXHR, textStatus, errorThrown) {
                  // The submit action failed
              }
         });
        

        请注意,successerror 事件处理程序接收的参数与您从 jQuery 的相应事件接收的参数相同ajax 方法。

        【讨论】:

        【解决方案9】:

        我得到了以下内容:

        formSubmit('#login-form', '/api/user/login', '/members/');
        

        在哪里

        function formSubmit(form, url, target) {
            $(form).submit(function(event) {
                $.post(url, $(form).serialize())
                    .done(function(res) {
                        if (res.success) {
                            window.location = target;
                        }
                        else {
                            alert(res.error);
                        }
                    })
                    .fail(function(res) {
                        alert("Server Error: " + res.status + " " + res.statusText);
        
                    })
                event.preventDefault();
            });
        }
        

        这假设 'url' 的帖子以 {success: false, error:'my Error to display'} 的形式返回一个 ajax

        你可以随意改变它。随意使用该 sn-p。

        【讨论】:

        • 这里的target 是什么?为什么要使用 AJAX 提交表单,然后重定向到新页面?
        【解决方案10】:

        jQuery AJAX 提交表单,就是点击按钮时使用表单 ID 提交表单

        请按步骤操作

        第 1 步 - 表单标签必须有一个 ID 字段

        <form method="post" class="form-horizontal" action="test/user/add" id="submitForm">
        .....
        </form>
        

        你要点击的按钮

        <button>Save</button>
        

        第 2 步 - submit 事件在 jQuery 中,有助于提交表单。在下面的代码中,我们正在准备来自 HTML 元素 name 的 JSON 请求。

        $("#submitForm").submit(function(e) {
            e.preventDefault();
            var frm = $("#submitForm");
            var data = {};
            $.each(this, function(i, v){
                var input = $(v);
                data[input.attr("name")] = input.val();
                delete data["undefined"];
            });
            $.ajax({
                contentType:"application/json; charset=utf-8",
                type:frm.attr("method"),
                url:frm.attr("action"),
                dataType:'json',
                data:JSON.stringify(data),
                success:function(data) {
                    alert(data.message);
                }
            });
        });
        

        点击下方链接观看现场演示

        How to submit a Form using jQuery AJAX?

        【讨论】:

          【解决方案11】:

          我知道这是一个与jQuery 相关的问题,但是现在使用 JS ES6 的日子要容易得多。由于没有纯 javascript 答案,我想我可以为此添加一个简单的纯 javascript 解决方案,在我看来,通过使用 fetch() API 更简洁。这是一种实现网络请求的现代方式。在您的情况下,由于您已经有一个表单元素,我们可以简单地使用它来构建我们的请求。

          const form = document.forms["orderproductForm"];
          const formInputs = form.getElementsByTagName("input"); 
          let formData = new FormData(); 
          for (let input of formInputs) {
              formData.append(input.name, input.value); 
          }
          
          fetch(form.action,
              {
                  method: form.method,
                  body: formData
              })
              .then(response => response.json())
              .then(data => console.log(data))
              .catch(error => console.log(error.message))
              .finally(() => console.log("Done"));
          

          【讨论】:

            【解决方案12】:

            试试

            fetch(form.action,{method:'post', body: new FormData(form)});
            

            function send(e,form) {
              fetch(form.action,{method:'post', body: new FormData(form)});
            
              console.log('We submit form asynchronously (AJAX)');
              e.preventDefault();
            }
            <form method="POST" action="myapi/send" onsubmit="send(event,this)" name="orderproductForm">
                <input hidden name="csrfToken" value="$0meh@$h">
                <input name="email" value="aa@bb.com">
                <input name="phone" value="123-456-666">
                <input type="submit">    
            </form>
            
            Look on Chrome Console > Network after/before 'submit'

            【讨论】:

              【解决方案13】:

              考虑使用closest

              $('table+table form').closest('tr').filter(':not(:last-child)').submit(function (ev, frm) {
                      frm = $(ev.target).closest('form');
                      $.ajax({
                          type: frm.attr('method'),
                          url: frm.attr('action'),
                          data: frm.serialize(),
                          success: function (data) {
                              alert(data);
                          }
                      })
                      ev.preventDefault();
                  });
              

              【讨论】:

                【解决方案14】:

                您可以在提交功能上使用它,如下所示。

                HTML 表单

                <form class="form" action="" method="post">
                    <input type="text" name="name" id="name" >
                    <textarea name="text" id="message" placeholder="Write something to us"> </textarea>
                    <input type="button" onclick="return formSubmit();" value="Send">
                </form>
                

                jQuery 函数:

                <script>
                    function formSubmit(){
                        var name = document.getElementById("name").value;
                        var message = document.getElementById("message").value;
                        var dataString = 'name='+ name + '&message=' + message;
                        jQuery.ajax({
                            url: "submit.php",
                            data: dataString,
                            type: "POST",
                            success: function(data){
                                $("#myForm").html(data);
                            },
                            error: function (){}
                        });
                    return true;
                    }
                </script>
                

                欲了解更多详情和样品访问: http://www.spiderscode.com/simple-ajax-contact-form/

                【讨论】:

                  【解决方案15】:

                  为了避免多次发送表单数据:

                  在再次提交表单之前不要忘记取消绑定提交事件, 用户可以多次调用 sumbit 函数,可能是他忘记了什么,或者是验证错误。

                   $("#idForm").unbind().submit( function(e) {
                    ....
                  

                  【讨论】:

                    【解决方案16】:

                    如果你使用 form.serialize() - 你需要给每个表单元素起这样的名字:

                    <input id="firstName" name="firstName" ...
                    

                    然后表单会像这样被序列化:

                    firstName=Chris&lastName=Halcrow ...
                    

                    【讨论】:

                      【解决方案17】:

                      我很惊讶没有人将data 作为一个对象提及。对我来说,这是最干净、最简单的数据传递方式:

                      $('form#foo').submit(function () {
                          $.ajax({
                              url: 'http://foo.bar/some-ajax-script',
                              type: 'POST',
                              dataType: 'json',
                              data: {
                                  'foo': 'some-foo-value',
                                  'bar': $('#bar').val()
                              }
                          }).always(function (response) {
                              console.log(response);
                          });
                      
                          return false;
                      });
                      

                      然后,在后端:

                      // Example in PHP
                      $_POST['foo'] // some-foo-value
                      $_POST['bar'] // value in #bar
                      

                      【讨论】:

                      • OP 说他不知道字段名称/未确定,因此在这种情况下不能使用数据,因为不知道字段名称。
                      【解决方案18】:

                      这不是 OP 问题的答案,
                      但是如果你不能使用静态表单DOM,你也可以这样尝试。

                      var $form = $('<form/>').append(
                          $('<input/>', {name: 'username'}).val('John Doe'),
                          $('<input/>', {name: 'user_id'}).val('john.1234')
                      );
                      
                      $.ajax({
                          url: 'api/user/search',
                          type: 'POST',
                          contentType: 'application/x-www-form-urlencoded',
                          data: $form.serialize(),
                          success: function(data, textStatus, jqXHR) {
                              console.info(data);
                          },
                          error: function(jqXHR, textStatus, errorThrown) {
                              var errorMessage = jqXHR.responseText;
                              if (errorMessage.length > 0) {
                                  alert(errorMessage);
                              }
                          }
                      });
                      

                      【讨论】:

                        【解决方案19】:

                        JavaScript

                        (function ($) {
                            var form= $('#add-form'),
                              input = $('#exampleFormControlTextarea1');
                        
                        
                           form.submit(function(event) {
                        
                               event.preventDefault(); 
                        
                               var req = $.ajax({
                                   url: form.attr('action'),
                                   type: 'POST',
                                   data: form.serialize()
                               });
                            req.done(function(data) {
                               if (data === 'success') {
                                   var li = $('<li class="list-group-item">'+ input.val() +'</li>');
                                    li.hide()
                                        .appendTo('.list-group')
                                        .fadeIn();
                                    $('input[type="text"],textarea').val('');
                                }
                           });
                        });
                        
                        
                        }(jQuery));
                        

                        HTML

                            <ul class="list-group col-sm-6 float-left">
                                    <?php
                                    foreach ($data as $item) {
                                        echo '<li class="list-group-item">'.$item.'</li>';
                                    }
                                    ?>
                                </ul>
                        
                                <form id="add-form" class="col-sm-6 float-right" action="_inc/add-new.php" method="post">
                                    <p class="form-group">
                                        <textarea class="form-control" name="message" id="exampleFormControlTextarea1" rows="3" placeholder="Is there something new?"></textarea>
                                    </p>
                                    <button type="submit" class="btn btn-danger">Add new item</button>
                                </form>
                        

                        【讨论】:

                          【解决方案20】:

                          还有提交事件,可以像这样触发 $("#form_id").submit()。如果表单已经在 HTML 中很好地表示,您将使用此方法。您只需在页面中阅读,用东西填充表单输入,然后调用 .submit()。它将使用表单声明中定义的方法和操作,因此您无需将其复制到您的 javascript 中。

                          examples

                          【讨论】:

                          • 如果你删除了你的帖子,你会得到已经从你身上拿走的罚分。
                          • 这将提交表单,但不是通过 AJAX,所以不回答问题。
                          • @spider 所说的,还有一个很好的徽章,叫做“同伴压力”
                          猜你喜欢
                          • 2011-04-23
                          • 2012-04-05
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多