如何检测页面滚动到底部并执行一次功能

时间:2013-02-20 14:18:37

标签: javascript jquery

我使用ajax从Web服务动态加载XML,返回的记录仅限于25个项目,每个网址加载'或者“打电话”....解决这个问题我有一个过程,用户向下滚动页面,当它们达到页面高度的90%时(或当它们到达页面底部时 - 不确定哪个我和#39;我将选择),名为startindexnum的变量增加25。

所以startindexnum从25开始...然后在第一次'#s; fire'该函数,startindexnum变为50,在3日变为75,等等。

我的问题是它会多次触发并且有些不稳定 - 当我滚动到底部并且有时增加超过25次时处理多次(毫无疑问是我认为多次运行的结果)。

任何人都知道我需要调整什么才能正确生成增量startindex变量以附加到我的ajax URL,我在哪里检索XML?感谢。

var scrollcount = 1;
var startindexnum = 25;
var processing;

$(document).ready(function(){
    $(document).scroll(function(e){
       if (processing)
            return false;

            window.onscroll = function(ev) {

             if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight){
                //if ($(window).scrollTop() >= ($(document).height() - $(window).height())*0.9){
                    // you're at x%  of the page
                    processing = true;
                    scrollcount = scrollcount + 1;
                    startindexnum = scrollcount * startindexnum;
                    console.log(scrollcount);
                    docall();

                    processing = false;

                };
            };
    });
});

2 个答案:

答案 0 :(得分:1)

问题是我打赌docall()是异步调用,因此在该调用之后将processing设置为false不会阻止将来的滚动事件。

在返回结果之前发生false设置。当processing完成任务时,您希望将docall()设置为false。

         if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight){
            //if ($(window).scrollTop() >= ($(document).height() - $(window).height())*0.9){
                // you're at x%  of the page
                processing = true;
                scrollcount = scrollcount + 1;
                startindexnum = scrollcount * startindexnum;
                console.log(scrollcount);
                docall();

                //processing = false;  <--get rid of this

            };

function docall(){

    //When you are done fetching the new data and update the page set 
    function AjaxCallIsDone() {
        processing = false;
    }

}

答案 1 :(得分:0)

除了epascarello的帖子......

您不需要每次执行文档滚动处理程序时附加的$(document).scroll(fn)和window.onscroll。一些事情:

1)首先,看看John Resig的这篇卷轴文章。 Scrolling by J.Resig

2)如果你想要jquery方法,那么使用window而不是document $(window).scroll(fn)。

3)如果没有,那么我认为以下内容适合您:

var scrollcount = 1;
var startindexnum = 25;
var processing;

$(document).ready(function(){
    window.onscroll = function(ev) {
        if (!processing) {   
            if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight){
                processing = true;
                scrollcount = scrollcount + 1;
                startindexnum = scrollcount * startindexnum;
                console.log(scrollcount);
                docall();
            }
        }               
    }
});