2010-10-09 102 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