首页 文章

jQuery AJAX提交表单

提问于
浏览
782

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

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

我想有一种方法可以做点什么

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

但是我并不完全知道所有表格输入 . 是否有一个功能,功能或只发送所有表单输入的东西?

15 回答

  • 427

    简易版(不发送图片)

    <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为php设置 HTTP_X_REQUESTED_WITH

    PHP

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

    您也可以使用 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 .

  • 11

    jQuery AJAX submit form ,只需在您点击按钮时使用表单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?

  • 4

    您需要记住一些事项 .

    1. There are several ways to submit a form

    • 使用提交按钮

    • 按Enter键

    • 通过在JavaScript中触发提交事件

    • 可能更多,具体取决于设备或将来的设备 .

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

    2. Hijax

    用户可能未启用JavaScript . 这里的 hijax 模式非常好,我们可以使用JavaScript轻轻控制表单,但如果JavaScript失败则保持可提交 .

    我们应该从表单中提取URL和方法,因此如果HTML发生更改,我们就不需要更新JavaScript .

    3. Unobtrusive JavaScript

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

    Speed

    理想情况下,我们应该使用外部脚本,而不是插入内联脚本 . 我们可以使用脚本标记链接到页面的head部分,或者链接到页面底部以获得速度 . 该脚本应该悄然增强用户体验,而不是妨碍用户体验 .

    Code

    假设您同意以上所有内容,并且想要捕获提交事件,并通过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');
    });
    

    Edit:

    我最近不得不这样做,最后写了一个插件 .

    (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();
    });
    
  • 32

    即使文件输入,此代码也可以使用

    $(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)
            {
    
    
            }
        });        
    });
    
  • 4

    为了避免多个formdata发送:

    不要忘记取消绑定提交事件,在再次提交表单之前,用户可以多次调用sumbit函数,也许他忘了某些东西,或者是验证错误 .

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

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

    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/

  • 720

    这是一个简单的参考:

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

    我希望它对你有所帮助 .

  • 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>
    
  • 21

    我真的很喜欢this answer superluminary,特别是他包装的方式是jQuery插件中的解决方案 . 所以感谢superluminary一个非常有用的答案 . 但就我而言,我想要一个插件,允许我在初始化插件时通过选项定义成功和错误事件处理程序 .

    所以这就是我提出的:

    ;(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表单,并提供onsubmit,成功和错误事件处理程序,以实现表单提交状态的用户反馈 . 这允许插件使用如下:

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

    请注意,成功和错误事件处理程序会收到相同的内容您将从jQuery ajax方法的相应事件中获得的参数 .

  • 5

    我为我得到了以下内容:

    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

    您可以根据需要改变它 . 随意使用该片段 .

  • 169

    您可以使用Ajax Form Plugin中的ajaxForm / ajaxSubmit函数或jQuery序列化函数 .

    AjaxForm

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

    要么

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

    当按下提交按钮时,ajaxForm将发送 . ajaxSubmit立即发送 .

    Serialize

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

    AJAX serialization documentation is here .

  • 1155

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

    examples

  • 5

    如果您正在使用form.serialize() - 您需要为每个表单元素指定一个如下名称:

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

    表单序列化如下:

    firstName=Chris&lastName=Halcrow ...
    
  • 9

    考虑使用 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();
        });
    

相关问题