2012-07-09 100 views
2

我不確定我即將問的事情是可能的還是正確的做事方式,但是在這裏。是否有可能停止當前執行的Javascript代碼?

我有一個網頁,它使用AJAX從服務器加載一些數據並以可視方式顯示它。用戶可以選擇使用頁面上的兩個按鈕之一來「滾動」按周過濾的數據。 這些按鈕的代碼是這樣的:

$("#leftButton").click(function() { 
    clearCurrentlyDisplayedData(); 
    changeFilter(1); //Or -1, or whatever. 
    loadAndDisplayData(); 
} 

在本(簡化的)實施例,loadAndDisplayData()將使用AJAX調用來獲取該數據,然後在完成請求顯示它,這樣的:

$.get(
    "web/service/address", 
    function (data, textStatus, jqXHR) { 
    //Display the data here 
}); 

但是,用戶單擊箭頭以快速滾動數據時出現問題。如果快速連續點擊兩次按鈕,則會顯示兩週的數據。

不要想要禁用按鈕,直到數據被收集 - 由於數據收集和顯示確實需要一點時間,這會殺死用戶快速瀏覽網站的能力,並會很快變得刺激。

當用戶點擊其中一個按鈕以防止加載兩組數據時,是否有可能殺死當前正在執行的腳本或AJAX調用(或稱爲這些調用的函數)?有什麼其他方式可以解決這個問題嗎?

回答

3

jqXHR object has an abort() method,你可以調用它來取消一個AJAX請求。

但是,這要求您保留對由$.get()返回的對象的引用。

可能更容易的方法是在發出請求時遞增全局計數器,並在請求完成時遞減全局計數器。在您的success處理程序中,如果計數器=== 0(例如,沒有待處理的請求)僅顯示結果。

+0

這兩個優秀的建議 - 謝謝! – nitsua 2012-07-09 14:31:49

1

有沒有其他辦法可以解決這個問題?

而不是中止請求,它可能是更好地構建回調函數內$.get在清除數據顯示新的數據作爲一個單一的操作方式 - 即不清除數據,直到新數據已準備就緒。

JavaScript一次只處理一個事件/線程,所以每個AJAX響應都會在它們到達時連續處理。