繁体   English   中英

AJAX触发两次(无限滚动)。 为什么?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM