[英]AJAX firing twice (infinite scroll). Why?
我正在尝试使用AJAX调试无限滚动实现。
//the-JavaScript
$("#loadingDiv").hide();
var loadIndex = 0;
$(window).scroll(function(){
if($(window).scrollTop() == $(document).height() - $(window).height()){
loadIndex = loadIndex + 1;
$("#loadingDiv").show();
$.post("ajaxinfinitescroll.php",{loadIndex:loadIndex},function(data){
setTimeout(function(){
$("div.loadMoreData").append(data);
$("#loadingDiv").hide();
}, 1000); // wait 1 second
})
}
})
//the-PHP
$loadIndex = $_POST['loadIndex'];
echo $loadIndex;
//the-HTML
<div class='loadMoreData'></div>
<div id='loadingDiv'>loadingimage.gif</div>
第一次滚动到页面末尾后,HTML输出应该为1
,但是我为12
。 下次我滚动到页面末尾时,应该以12
结尾,但实际上是以1234.
结尾1234.
因此,AJAX似乎每次发射两次。 为什么?
如果您更改逻辑,我想它应该能很好地工作:
$(window).scrollTop() > $(document).height() - $(window).height()
之后,您必须添加一个标志以检查新内容是否已加载,然后重新初始化滚动功能以恢复到旧内容。
// Add a flag
var scrolled = false;
// Change the logic
$(window).scrollTop() > $(document).height() - $(window).height()
// allow AJAX call only if not scrolled
if (!scrolled) {
// immediately, revert the flag:
scrolled = true;
$.ajax(function () {
// inside the AJAX call, restore it
scrolled = false;
});
}
在这种情况下,您需要跟踪“ isLoading”状态并停止自动加载行为。
更好的是,在加载ajax请求时删除滚动甚至侦听器。 得到回应后,将其重新添加。
为了将来参考,我最初尝试了以下解决方案,但是没有用。 我通过@Louy实现了isLoading
概念,但将其放在错误的行中:
//the JavaScript
$("#loadingDiv").hide();
var loadIndex = 0;
var isLoading = false;
if (!isLoading) {
$(window).scroll(function(){
if($(window).scrollTop() == $(document).height() - $(window).height()){
isLoading = true;
loadIndex = loadIndex + 1;
$("#loadingDiv").show();
$.post("ajaxinfinitescroll.php", {loadIndex:loadIndex},function(data){
setTimeout(function(){
$("div.loadMoreData").append(data);
$("#loadingDiv").hide();
isLoading = false;
}, 1000); // wait 1 second
})
}
})
}
然后我从@Praveen_Kumar获得了帮助,并更改了isLoading
出现的行,并且该行有效:
//the JavaScript
$("#loadingDiv").hide();
var loadIndex = 0;
var isLoading = false;
$(window).scroll(function(){
if (!isLoading) {
if($(window).scrollTop() == $(document).height() - $(window).height()){
isLoading = true;
loadIndex = loadIndex + 1;
$("#loadingDiv").show();
$.post("ajaxinfinitescroll.php", {loadIndex:loadIndex},function(data){
setTimeout(function(){
$("div.loadMoreData").append(data);
$("#loadingDiv").hide();
isLoading = false;
}, 1000); // wait 1 second
})
}
}
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.