2010-10-09 30 views
0

好吧有兩種方法可以。一個來自演示方面,另一個來自「處理」方面。Jquery - 防止來自「堆疊」的ajax請求

現在我有一個數據表設置。某些操作(輸入搜索查詢,點擊不同的頁碼,等...),觸發了一個名爲refreshData()

refreshData()首先調用showOverlay()功能漸漸消逝與loading.gif圖像的疊加。然後它執行$.post()請求來獲取一些json數據。然後,如果成功,它會調用hideOverlay(),這會淡出疊加層。

function refreshData() 
    { 
     showOverlay(); 
     var parameters = {'page' : '1', 'per-page' : '5'}; 
     $.post(updateUrl, parameters, 
      function(data){ 
       $('#data-container table tbody').empty(); 
       $.each(data.users, function(i, user){ 
        $('#data-container table tbody').append('<tr>'+ 
        '<td>'+ user.name +'</td>'+ 
        '<td>'+ user.registered +'</td>'+ 
        '<td>'+ user.id +'</td>'+ 
        '<td><a href="https://stackoverflow.com/users/edit/' + user.id + '">edit</a></td>'+ 
        '</tr>' 
        ); 
       }); 
       alternateRows(); 
       hideOverlay(); 
     }, "json"); 
    } 

我的第一個問題(表示)是,如果refreshData()反覆調用,覆蓋淡入和淡出了個遍。它被堆疊起來,即使用戶沒有做任何事情,它也會淡入淡出,直到它完成了多次操作。如果最近的「請求」完成,我希望它只能淡出。

我的第二個問題(處理)可能無關緊要。我想知道是否在向DOM追加新項目之前,我應該檢查是否還有新的請求。如果沒有必要添加一些東西來刪除它們。這足夠重要嗎?如果這是我該怎麼做?

回答

0

我不知道你的showOverlay()函數是什麼樣子,但你可以做這樣的事情:

function showOverlay() 
{ 
    if($('#overlay :animated').length > 0 || $('#overlay').hasClass('visible')) 
    { 
     return; 
    } 
    //Show overlay 
} 

:animated

1
<html> 
<head> 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> 

<script> 
$(document).ready(function() { 
    var timer = 1000; // milliseconds 

    var running = false; 
    $("#myTextField").keypress(function() { 
     if (!running) { 
      running = true; 

      $.getJSON('object.json', function(data) { 
       setTimeout(function() { 
        alert($("#myTextField").val()); 
        running = false; 
       }, timer); 
      }); 
     } 
    }); 
}); 
</script> 
</head> 

<body> 

<input id="myTextField" type="text" size="100%" /> 
</body> 

</html> 
+0

在這個例子中,JSON將被稱爲最多每秒一次,因爲在內部函數完成之前,「運行」不會設置爲false。 – Corey 2010-10-09 02:48:29