2012-04-11 108 views
1

有沒有什麼方法可以計算jQuery ajax請求持續了多久?有時候搜索會花費太長時間,如果搜索接管了5秒,那麼添加一個jquery abort()按鈕會很好。任何方式,我可以做到這一點!時間ajax請求

在ajax請求的另一端是一個php文件,它發出postgresql請求。

非常感謝您的任何想法!

+0

你可以下載firebug for firefox或chrome ... – Dutchie432 2012-04-11 18:36:43

回答

2

要讓中止按鈕出現5秒鐘後,您的來電send後添加setTimeout功能。一旦AJAX命令完成,您可以添加代碼來清除超時並刪除中止按鈕(如果存在)。

var timeOutID = 0; 
$.ajax({ 
    url: 'ajax/test.html', 
    success: function(data) {  
    clearTimeOut(timeOutID); 
    // Remove the abort button if it exists. 
    } 
}); 
timeOutID = setTimeout(function() { 
       // Add the abort button here. 
       }, 5000); 

這樣,如果AJAX返回足夠快的中止按鈕將不會出現。

+0

謝謝!這聽起來像一個好主意。我有點不清楚在$ .ajax的方案中實現這個超時的情況({type:「POST」, url:「search.php」,...我把那個放在哪裏? – 1252748 2012-04-11 19:47:48

+0

@ user1252748 Updated以更好的示例文本。 – 2012-04-11 19:56:36

2

看看超時選項(http://api.jquery.com/jQuery.ajax/)。您可以在特定的呼叫中設置它,或者使用$ .ajaxSetup()全局設置它。

+0

不是說jquery/ajax timeout指的是某種錯誤?就像,它會在發生這種情況之後停止處理ajax,而不是讓用戶選擇取消呼叫。還是我誤會了?謝謝。 – 1252748 2012-04-11 19:49:34

+0

是的,我的理解是,該選項在指定的時間後無條件地取消操作。而當我重讀你的問題時,這不完全是你想要做的。 setTimeout()可能是更好的方法。 – 2012-04-11 20:10:07

1

通常情況下,我會設置一個超時,一旦請求被髮送,將在10秒左右後觸發,然後回退到別的東西,以確保它仍然發生(例如,表單提交)。

所以變量設置爲false,var failed = false;做請求 在該請求啓動的同時,設置超時:

setTimeout(function() { 
    failed = true; 
    $("#form").submit(); 
    return false; 
}, 10000); 

在AJAX調用的返回功能,請檢查失敗的變量已被設置爲true,如果有的話,實際上不要做它最初嘗試的任何事情,否則它可能會弄亂某些東西,或者在發生其他事情時混淆用戶(因爲這些事情通常發生在較慢的Internet上連接,如果在加載新頁面時下一步出現,他們可能嘗試進行交互,然後頁面將改變)。

$.post("ajaxcall.php", {'etc': "etc"}, 
    function(returned) { 
     if (failed != true) { 
      //do whatever with returned variable 
     } 
}); 
0
var timer = 0, 
    XHR = $.ajax({ 
      url: 'ajax/mypage.html', 
      beforeSend: function() { 
       timer=setTimeout(showAbort, 5000); 
      } 
      }); 

function showAbort() { 
    $('<input type="button" value="Abort" id="abort_button"/>').appendTo('#some_parent'); 
    $('#abort_button').on('click', function() { 
     XHR.abort(); //abort the Ajax call 
    }); 
} 

XHR.always(function() { //fires on both fail and done 
    clearTimeout(timer); 
    if ($('#abort_button').length) { 
     $('#abort_button').remove(); //remove button if exists 
    } 
});