jqueryajax提交表单

vq8itlhq  于 2021-09-13  发布在  Java
关注(0)|答案(20)|浏览(691)

我有一张有名字的表格 orderproductForm 和未定义数量的输入。
我想做一些jquery.get或ajax之类的事情,通过ajax调用页面,并发送表单的所有输入 orderproductForm .
我想一种方法是做类似的事情

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

然而,我并不完全知道所有的表单输入。是否有只发送所有表单输入的特性、函数或其他东西?

fcy6dtqo

fcy6dtqo16#

简单版本(不发送图像)

<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答案的修改版本
它将使用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);
            }
        });
    }
});

在服务器端,您可以使用jquery设置的这个头来检测ajax请求 HTTP_X_REQUESTED_WITH 对于php
php

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

kt06eoxx17#

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

njthzxwz

njthzxwz18#

有几件事你需要记住。
1.提交表格有几种方式
使用提交按钮
按回车键
通过在javascript中触发提交事件
可能更多取决于设备或未来设备。
因此,我们应该绑定到表单提交事件,而不是按钮单击事件。这将确保我们的代码现在和将来在所有设备和辅助技术上工作。
2.hijax
用户可能未启用javascript。hijax模式在这里很好,我们使用javascript轻轻地控制表单,但如果javascript失败,就让表单保持可提交状态。
我们应该从表单中提取url和方法,因此如果html发生更改,我们不需要更新javascript。
3.不引人注目的javascript
使用event.preventdefault()而不是return false是一种很好的做法,因为它允许事件冒泡。这允许其他脚本绑定到事件中,例如监控用户交互的分析脚本。
速度
理想情况下,我们应该使用外部脚本,而不是内联插入脚本。我们可以使用脚本标记在页面的标题部分链接到它,或者在页面底部链接到它以提高速度。脚本应该悄悄地增强用户体验,而不是妨碍用户。
代码
假设您同意以上所有内容,并且希望捕获submit事件,并通过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)

将数据自动提交属性添加到表单标记中,然后可以执行以下操作:

html

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

js

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

eoxn13cs19#

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

<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>
s71maibg

s71maibg20#

这是一个简单的参考:

// 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 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.
           }
         });

});

相关问题