1

我试图通过检查用户是否接近底部来使用 AJAX 和 JQuery 动态获取帖子。服务器端在 GAE 上的 python 中。

监听滚动:

this.config.window.on('scroll',this.loadContent);

1.检查与底部的距离

2.发送一个带有当前帖子数量的ajax请求,以便检索下10个

3.results.check = true 表示服务器没有更多帖子要发送。

    loadContent: function(){
        // 1
        if($(document).height() - $(window).height() - $(window).scrollTop() < 1000) {
            var posts = $('.troll').children('div').length;
            data = 'loadmore=True&offset=' + posts;   //2
            $.ajax({               
                url: '/',
                type: 'POST', 
                data: data,
                dataType: 'json',
                success: function(results){
                    if (results.check === 'true'){  //3 
                        $(window).unbind('scroll');
                        return;
                    }
                    Post.insert10Values(results);
                }
            });
        };
    },

    insert10Values: function(results){
        var update = Handlebars.compile($('#troll10').html()),
            troll10update = update(results);

        $('div.troll').append( troll10update );
    }

这里的问题是,当快速滚动时,两个或多个请求被发送到服务器并且我得到重复的条目。我想对客户端进行速率限制。

4

3 回答 3

2

您的部分问题是滚动事件每秒会触发多次

您可以限制任何函数调用,执行如下操作:

var scrollTimer=false;
var delay=500; /* 1/2 second*/
$(window).on('scroll',function(){
   if( scrollTimer){
       clearTimeout( scrollTimer);
   }

   scrollTimer=setTimeout(function(){           
       /* run your code here*/
   }, delay);

});

至于 ajax,您可以存储最后一次 ajax 调用的时间,并在进行新的 ajax 调用之前根据现在与存储的时间设置最小差异

var lastAJAX=Date.now(), AJAXMin=5000;/* 5 seconds*/

function checkAJAXCalls(){
    var now=Date.now(), diff=now-lastAJAX; 
    if( diff >= AJAXMin){
        lastAJAX=now;
         return true;
    }else{
        return false;
    }
}

然后if(checkAJAXCalls())在发出请求之前运行。也可以修改概念以lastAJAX在成功回调中$.ajax更新

于 2012-12-23T20:32:15.773 回答
2

设置标志 loading = false。在发送请求之前,请检查标志。如果为假,则将该标志设置为真并继续请求,否则忽略该事件。当结果到达时,显示它们并将标志设置回 false。

于 2012-12-23T20:33:38.707 回答
1

jQuery.ajax有一个方法叫做beforeSend. 它在您的 ajax 调用之前执行。您可以使用它来检查是否有任何其他请求正在进行中,如果有则取消呼叫。如果您在beforeSend函数中返回 false,则不会触发 ajax 调用,因此您不会有任何重复的内容。

$.ajax({               
    url: '/',
    type: 'POST', 
    data: data,
    dataType: 'json',
    beforeSend: function() {
        if (window.nextPageProcess) {
          return false;
        } else {
          window.nextPageProcess = 1;
        }
    },
    success: function(results){
        if (results.check === 'true'){  //3 
            $(window).unbind('scroll');
            return;
        }
        Post.insert10Values(results);
          window.nextPageProcess = 1;
    }
});
于 2012-12-23T20:31:58.313 回答