2013-11-25 199 views
29

我有一个表单,我通过jquery捕获并通过ajax发送。我的问题是,每次刷新页面时,表单都会多次提交。jquery ajax表单提交两次

我试图解除绑定提交按钮,但随后形式后的第一个提交正常发布。任何帮助,将不胜感激

$('#exportForm').submit(function() { 

    $.ajax({ 
    type: "POST", 
    url: $(this).attr('action'), 
    data: $(this).serialize(), 
    success: function(response) { 
     $('#exportForm').unbind('submit'); 
     console.log(response); 
    } 
    }); 

    return false; 
}); 
+1

回答我已经添加jquery.unobtrusive-ajax.min.js裁判两次,我认为你需要提供更多的代码 – cosset

+0

嘿宠儿,这几乎是所有有其他比一个非常基本的形式。你还需要什么? –

回答

24

这很可能是你使用的是buttonsubmit触发AJAX事件。试试这个:

$('#exportForm').submit(function(e){ 
     e.preventDefault(); 
     $.ajax({ 
      type: "POST", 
      url: $(this).attr('action'), 
      data: $(this).serialize(), 
      success: function(response) { 
       console.log(response); 
      } 
     }); 

     return false; 
    }); 
+0

谢谢,我删除了'$('#exportForm')。unbind('submit');'并添加了'e.preventDefault();'它似乎已经奏效。我会尽我所能接受。 –

+0

有趣的 - 你说'返回false'将无法阻止默认表单提交操作? http://jsfiddle.net/rR8Xz/ –

+0

对不起,经过更多的测试发现它不起作用。 –

75

除了调用preventDefault之外,还对事件调用stopImmediatePropagation。

$('#exportForm').submit(function(e){ 
    e.preventDefault(); 
    e.stopImmediatePropagation(); 
    $.ajax({ 
     type: "POST", 
     url: $(this).attr('action'), 
     data: $(this).serialize(), 
     success: function(response) { 
      console.log(response); 
     } 
    }); 

    return false; 
}); 
+7

虽然您的答案可能会解决问题,但如果您可以提供有关您的答案如何解决该问题的说明,那将会更好。在这种情况下,为什么'preventDefault'是不够的。这是一个进一步改善这个和未来答案的建议。 –

+7

添加e.stopImmediatePropagation();为我工作,谢谢克里斯!今天晚上我一直在为此挠头约2个小时。尽管e.preventDefault()本身在过去对我有用,但我怀疑这是因为它对于简单的链接或按钮来说很好,但是在表单的提交事件中工作时,必须使用e.stopImmediatePropagation()来防止事件从冒昧的起泡。请参阅http://api.jquery.com/event.stopImmediatePropagation/。 – Robini

+1

这就是答案。 – Andrew

8

如果您正在使用某种形式的验证(例如jQuery验证),表单被提交两次,因为除了$('#exportForm').submit你自己编写的验证插件也将提交表单成功地验证所有后场。

注:如果您使用jQuery验证,避免使用.submit()。相反,请使用submitHandler

0

这个问题可以通过使用代替按钮的DIV你的PHP形式来解决。由于使用了ajax,因此不需要按钮。

0

正如克里斯Sercombe指出,e.stopImmediatePropagation()不工作,它肯定能解决问题,但你不应该使用它。这个问题在你的代码中仍然存在。让我提两个职位的要求怎么可能被送到一个例子:如果你正在使用AngularJS

,并让说你犯了一个名为“HandleAjaxController”控制器,可以将这个NG-控制器分配到一个div,然后小心分配这个ng-controller到内部div。这会导致发送请求被发送两次。所以:

<div ng-controller='HandleAjaxController'> 
     <div ng-controller='HandleAjaxController'> 
      <button id="home" type="button" class="btn btn-success">Send data</button> 

这引起了很大的压力,我一个时间,因为我的NG-路线我已经设置控制器在这里:

$routeProvider 
    .when("/", { 
     templateUrl : "src/js/partials/home.html", 
     controller : "HandleAjaxController" 
    }) 

,然后我在家里再次设定。 HTML:<div ng-controller='HandleAjaxController'>

不管怎么说,这是两个职位是如何被送到一个例子。