2016-08-11 49 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事件方法。