2014-03-04 105 views
0

我有以下的jQuery代碼,這個代碼的一點是要建立一個很短的時間延遲,因此AJAX請求得到及時正確地執行:延遲提交結果

$('#form_id').submit(function(e) { 

    e.preventDefault(); 
    $submit_url = $(this).data('submitUrl'); 
    $submit_url = $submit_url.replace('http://','').replace(window.location.host,''); 

    if ($(this).data('toBeAjaxSubmitted') == true) { 
     $.ajax($submit_url, { 
      type : $(this).attr('method'), 
      data : $(this).serialize(), 
      complete : function(data) { 
       $(this).data('toBeAjaxSubmitted', false); 
       $('#form_id').submit(); 
      } 
     }); 
    } 
}); 

會發生什麼事,表單首先提交我需要提交的URL,以便組件將條目保存到數據庫中。但是我也需要用戶輸入,直接提交到用戶付款的支付網關URL。

上面的代碼創建AJAX請求,但不返回到正常回發行爲(通過$('#form_id').submit())。

它使遍地提交表單,但從來沒有職位到網關URL重定向或出去。

我在做什麼錯?

+0

感謝馬特灣'java'標籤是我認爲的一個意外。 –

回答

1

後一些更多的調試以下爲我工作:

$('#chronoform_Online_Submission_Step8_Payment').submit(function(e) { 
    var form = this; 
    e.preventDefault(); 
    $submit_url = $(this).data('submitUrl'); 
    $submit_url = $submit_url.replace('http://','').replace(window.location.host,''); 

    if ($(this).data('toBeAjaxSubmitted') == true) { 
     $.ajax($submit_url, { 
      type : $(this).attr('method'), 
      data : $(this).serialize(), 
      complete : function(data, status) { 

      } 
     }).done(function() { 
      form.submit(); 
     }); 
    } 
}); 

真正把我在錯誤的道路上是在Chrome的開發者工具,我有以下選項啓用「禁用緩存(而DevTools是開放的)」,這是造成一些頭痛的Safari,火狐(它的工作)和Chrome哪些沒有之間不一致的行爲。

+0

需要明確的是,該變化是使用'this.submit()''VS $(本).submit()'。 'this.submit()'提交表單而不觸發提交事件,從而避免了無限循環。 –

0

怎麼樣fiddling用這種方法?

$('#form_id').submit(function(e) { 

    // closures 
    var $form = $(this); 
    var fAjaxComplete = function(data) { 
     // don't send the ajax again 
     $form.data('toBeAjaxSubmitted', 'false'); 

     // maybe do some form manipulation with data... 

     // re-trigger submit 
     $form.trigger('submit'); 
    }; 
    var oAjaxObject = { 
     type : $form.attr('method'), 
     data : $form.serialize(), 
     complete : fAjaxComplete 
    }; 

    var sSubmitUrl = $form.data('submitUrl'); 
    // scrub url 
    sSubmitUrl = sSubmitUrl.replace('http://','').replace(window.location.host,''); 

    // if ajax needed 
    if ($form.data('toBeAjaxSubmitted') != 'false') { 
     // go get ajax 
     $.ajax(sSubmitUrl, oAjaxObject); 
     // don't submit, prevent native submit behavior, we are using ajax first! 
     e.preventDefault(); 
     return false; 
    } 

    // if you got here, go ahead and submit 
    return true; 

});