2014-02-27 95 views
4

我對AJAX的錯誤全局錯誤處理程序:防止下一個事件處理程序/回調被稱爲

$(document).ready(function() { 
    $(document).ajaxError(ajaxErrorHandler); 
}); 

function ajaxErrorHandler(event, jqxhr, settings, exception) { 

    // ... 

    // How to stop further processing of the AJAX response here? 
} 

一旦我處理的錯誤,我不希望AJAX響應進一步處理的任何事情。我怎樣才能停止執行complete回調? (我的AJAX請求是在庫中進行的,我無法定義它們的參數)。

UPDATE:

調用jqxdr.abort()不會做的工作。

+0

[停止jQuery中的所有活動ajax請求]可能的重複(http://stackoverflow.com/questions/1802936/stop-all-active-ajax-requests-in-jquery) –

+0

我不認爲你可以因爲完整的處理程序將在調用ajaxError處理程序之前被調用。請參閱http://jsfiddle.net/arunpjohny/mM87r/1/ –

+0

@Roko我不認爲這個問題是重複的。至少,問題顯着不同。 – Alexey

回答

2

你可以在你的處理器試試這個:

function ajaxErrorHandler(event, jqxhr, settings, exception) { 

    // ... 

    // How to stop further processing of the AJAX response here? 
    event.stopPropagation(); 
} 

將事件傳播史停止父處理程序。

+0

感謝您的回覆。它不適合我。在'event.stopPropagation()'後面有一些代碼被執行。我不知道這個代碼被鉤住了什麼回調/事件。 – Alexey

+0

可能有另一個事件處理程序附加到ajaxComplete事件。您可以使用$ .ajaxSetup()並將它設置爲應聲明全局爲false的對象,然後註冊您的處理程序。 –

+0

我認爲代碼被附加到本地'complete'回調。在'jQuery.ajax()'參數中定義的那個。 – Alexey

1

這裏是觸發AJAX事件的完整列表:jQuery doc

completeajaxComplete活動的目的是,無論請求的狀態(成功或錯誤)的調用。如果它的執行取決於在ajaxErrorHandler中設置的某些條件,那麼我認爲它不應該被綁定到complete了。

您可以在success和一次一次插上error您當前complete回調,因此,在全球事件處理程序調用evt.stopPropagation()evt.stopImmediatePropagation()將防止回調執行。


處理成功/失敗事件繼承的jQuery代碼是here。如您所見,它涉及2個不同的延遲對象(其中一個處理resolved/rejected部分,一個處理completed部分)和兩個單獨的事件觸發器。

沒有內置的方法來乾淨地中斷此流程:全球ajaxError事件的處理與以下completeajaxComplete事件完全分開。

+0

感謝您的回覆。我的AJAX請求是由JavaScript庫製作的,我對它們的控制有限。但即使我完全控制了代碼,我仍然希望在全局的'ajaxError'(我重定向到一個錯誤頁面)中處理一些最關鍵的錯誤,而不會在頁面刷新之前發出其他可執行的命令。 – Alexey

+0

你如何「重定向到錯誤頁面」?如果使用'window.location.assign(url)',它會停止當前頁面上的所有JavaScript執行。 – LeGEC

+0

我剛試過。它不會停止JavaScript。即使是在'window.location.assign(url)'後面的行也會被執行。如果我找到一種方法來停止頁面上的所有JavaScript,它可能會解決我的問題。 – Alexey

相關問題