2011-09-22 41 views
0

我做了一个“向下滚动,启动ajaxrequest,加载更多内容”的功能。javascript - 我可以检查ajax是否正在加载?

但是为了正常工作,并且不会多次连续触发,因为在ajax数据加载到文档之前用户滚动更多,所以如果有任何ajaxrequests加载,我需要防止触发更多的ajaxrequests。

代码:

$(document).scroll(function() { 
var scrollBottom = $(document).height() - $(window).scrollTop(); 
if (scrollBottom < 3000) { 
var offset = parseInt($("#offset").html()) + 10; 
document.getElementById('offset').innerHTML = offset; 
$.ajax({ 
    type: "POST", 
    url: "/", 
    data: "offset=" + offset <?=$ajaxextra?>, 
    success: function(data){ 
    $("#mainContent").append(data); 
    }, 
    error: function(e) { 
    alert(e); 
    } 
}); 
} 
}); 

这就是我想我需要,在伪代码:

if (scrollBottom < 3000 && !ajax.isLoading()) 

人们怎样这样的事情?

回答

2

因为也许你可以启动多个AJAX请求,我认为,最好的解决方案之一 - 基本上,一个可靠的解决方案 - 首先创建请求的数组状态是这样的:

var ajaxRequestsState = []; 

当您启动AJAX请求,不应该将元素添加到这个数组像这样的:

ajaxRequestsState.push({ requestId: "some identifier" }); 

之后,如果需要检查,如果没有主动要求,你可以有一个标志,像这样:

function isAsyncRequestActive() { 
    return ajaxRequestsState.length > 0; 
} 

最后,当一个请求结束或失败,你必须这样做:

function releaseRequest(requestId) { 
    var requestIndex = 0; 
    var found = false; 

    while(!found && requestIndex < ajaxRequestsState.length) 
    { 
     found = ajaxRequestsState[requestIndex].requestId == requestId; 
     requestIndex++; 
    } 

    if(found) { 
     ajaxRequestsState.splice((requestIndex-1), 1); 
    } 
} 

releaseRequest("identifier of request which ended or failed"); 

这只是跟踪请求的状态并保持请求状态的集合,你就可以拥有它!

*已编辑!

1

我会推荐使用一个标志。

标志的概念是打开/关闭某些东西。在这种情况下,您可以指定一个全局布尔(true或false)变量(more on Global Variables in JS)。当你启动一个给定的ajax请求时,你将该变量设置为true,当ajax完成时,将它变回false。 您需要做的唯一事情是在您请求任何ajax请求时检查该全局变量。

考虑到你的例子:

// Global variable. It needs to be outside any function, you can make it the first line in your .js file. 
var isAjaxLoading = false; 
$(document).scroll(function() { 
var scrollBottom = $(document).height() - $(window).scrollTop(); 
if (scrollBottom < 3000 && !isAjaxLoading) { 
var offset = parseInt($("#offset").html()) + 10; 
document.getElementById('offset').innerHTML = offset; 
isAjaxLoading = true; 
$.ajax({ 
    type: "POST", 
    url: "/", 
    data: "offset=" + offset <?=$ajaxextra?>, 
    success: function(data){ 
    $("#mainContent").append(data); 
    isAjaxLoading = false; 
    }, 
    error: function(e) { 
    alert(e); 
    isAjaxLoading = false; 
    } 
}); 
} 
}); 
相关问题