2016-08-11 88 views
0

我们试图停止表单提交后从一个帖子验证返回。该电话是在承诺之内并在确认对话之后。jQuery - 防止提交内部承诺与后ajax验证

经过数小时的打破我的思想,我无法让它工作。

var $form = $('#frmBoleto'); 

$form.submit(function(e){ 
    var modo = $('input[name="modo"]:checked').val(); 

    if (modo == 'naoimprime'){ 
     // Send post 
     $.when($.post($form.attr('action') + '?verifica', $form.serialize())).then(function(d){ 
      if (d && d.exists){ 
       var answer = window.confirm('You sure?'); 

       if (!answer){ 
        e.preventDefault(); 
        e.stopImmediatePropagation(); 
        e.stopPropagation(); 
       } 
      } 
     }); 
    } 
}); 

表单总是被引用,为什么?

+0

因为ajax是异步的。在表单提交处理程序运行完成之前,ajax回调函数(带有e.preventDefault()的部分)不会执行。 –

回答

1

$post().then(...)回调在后面的事件线程中触发,因此来不及防止表单提交。

您需要禁止在.submit()处理程序中无条件地提交表单提交,并强制在.then()回调中有条件地提交。

var $form = $('#frmBoleto'); 

$form.submit(function(evt) { 
    evt.preventDefault(); 
    if ($('input[name="modo"]:checked').val() == 'naoimprime') { 
     $.post($form.attr('action') + '?verifica', $form.serialize()).then(function(d) { 
      if (d && d.exists && window.confirm('You sure?')) { 
       $form.get(0).submit(); 
      } 
     }); 
    } 
}); 
+0

谢谢。我做了这个,但使用$ form.trigger('submit')一次又一次地调用相同的回调... –

0

返回false在onsubmit事件方法。