我想向下滚动页面到某一点(#first_column DIV的高度),从服务器端获取json并将内容添加到#first_column。
现在问题是当我向下滚动到#first_column的高度时,几乎同时有很多Ajax调用。我想要的是向下滚动到#first_column的高度,调用服务器并获取json数据并将内容添加到#first_column。 #first_column的高度发生变化。然后我向下滚动到#first_column的高度将获得第二个Ajax请求。
有什么建议吗?
<script>
$(window).scroll(function(){
column_height = $("#first_column").height();
screenTop = $(window).scrollTop();
window_height = $(window).height();
if((screenTop+window_height)>=column_height){
$.ajax({
url: "/service/article_json.php",
type: 'GET',
async: false,
cache: false,
timeout: 30000,
error: function(){
return true;
},
success: function(data){
$.each($.parseJSON(data), function(key,item) {
//Add content to #first_column
});
}
});
}
});
答案 0 :(得分:5)
尝试使用标志,例如:
var ajaxInProgress = false;
$(window).scroll(function() {
if(ajaxInProgress) return;
ajaxInProgress = true;
$.ajax({
// setup here
success: {
// ...
ajaxInProgress = false;
},
error: {
// ...
ajaxInProgress = false;
}
});
});
在此示例中,当ajaxInProgress
设置为true
window.scroll回调将简单地返回并且不执行任何操作,否则该标志将被设置为true,该调用将在{{1在success
回调时,该标志将重置为error
,这将允许另一个ajax调用。
答案 1 :(得分:3)
你可以在if语句中取消绑定事件,然后在Success方法中重新绑定它,如果你愿意的话。
$(window).unbind('scroll');
答案 2 :(得分:2)
var ajaxcallrunning; //flag for ajax call
$(window).scroll(function() {
if(ajaxcallrunning)
{
return; // if a ajax call is running then return
}
ajaxcallrunning = 1; // otherwise set flag and execute ajax call
$.ajax({
// setup here
success: {
// ...
ajaxInProgress = 0; //reset flag after request complete
},
error: {
// ...
ajaxInProgress = 0; //reset flag if error occurs
}
});
});