当滚动位置在底部时,jQuery加载更多数据

时间:2015-05-20 10:57:46

标签: javascript php jquery

我有jQuery Scroll Auto Load More。该功能是使用PHP从数据库加载更多数据。

该功能运行正常,当我尝试滚动时,下一个数据将加载。直到我遇到问题,当我将滚动放到底部然后我刷新页面时,函数加载但它总是显示双数据。

到目前为止,这是我的JS功能:

$(document).ready(function()
{
     $('#content').scrollPagination(
     {
         nop : 10,
         id : 10,
         offset : 0,
         error : 'You have reached the end of the post.',   
         delay : 500,
         scroll : true
     });
});

(function($)
{
     $.fn.scrollPagination = function(options)
     {
          var settings =
          {
               nop     : 10, // The number of posts per scroll to be loaded
               offset  : 0, // Initial offset, begins at 0 in this case
               error   : 'No More Posts!',
               delay   : 500,
               scroll  : true
          }

          if(options)
          {
               $.extend(settings, options);
          }

          return this.each(function()
          {
               $this = $(this);
               $settings = settings;
               var offset = $settings.offset;
               var busy = false;
               if($settings.scroll == true) $initmessage = '';
               else $initmessage = 'Click for more';
               $this.append('<div class="content"></div><div class="loading-bar">'+$initmessage+'</div>');

               $('.animation_images').show();

               function getData()
               {
                    $.post('load_post_user.php', {
                    action        : 'scrollpagination',
                    number        : $settings.nop,
                    offset        : offset,
                    uid           : '<?php echo $q_uid; ?>',
                    }, function(data) {
                    $this.find('.loading-bar').html($initmessage);
                    $('.animation_images').hide();

                    if(data == "") {
                    $this.find('.loading-bar').html($settings.error);
                    }
                    else {
                    offset = offset+$settings.nop;
                    $this.find('.content').append(data);
                    busy = false;
                    }
                 });
                }

                getData();

                if($settings.scroll == true) {
                     $(window).scroll(function() {
                     if($(window).scrollTop() + $(window).height() > $this.height() && !busy) {
                         busy = true;
                         $('.animation_images').hide();
                         $this.find('.loading-bar').html('<img src="../assets/img/processing.gif"/>');

                         setTimeout(function() {
                             getData();
                         }, $settings.delay);
                        }
                       });
                      }

                 $this.find('.loading-bar').click(function() {
                      if(busy == false) {
                          busy = true;
                          getData();
                      }
                 });
               });
              }
             })(jQuery);

1 个答案:

答案 0 :(得分:1)

chat中所述,这是异步调用的问题,为了完整起见,我在这里回答。

脚本包含一个初始getData() - 调用,该调用最初为加载脚本时调用scrollPagination的每个元素触发。

getData引发异步“AJAX” - 使用给定参数调用后端,最初设置为nop = 10offset = 0

在此调用之后,绑定了窗口的滚动处理程序。它可能与浏览器不同,但是当页面完全加载时通常也会触发。

如果scrollposition设置为页面底部,则此处理程序中的if子句为true,而初始AJAX请求仍在处理中,这就是问题所在。

此请求成功返回后,偏移量将设置为新的正确值。由于请求在第一次触发滚动处理程序时没有返回任何内容,因此仍然将其设置为0,从而产生与&offset=0参数一致的完全相同的请求,当然,返回与第一次请求的结果相同。

这是因为没有为第一次调用设置busy bool,所以我推荐的方法是在调用busy=true;之前设置getData(),但是在开始时这个功能。

function getData()
{
    busy = true;
    $.post('load_post_user.php', {
        ....
    }
}

如果已经执行了另一个请求,这将阻止在滚动时一般发送第二个请求。

如果您仍希望在最初将滚动位置放在页面底部时加载内容的第二部分,则需要引入类似initial - 标记的内容;

在初始化开始时:

return this.each(function()
{
    $this = $(this);
    $settings = settings;
    var offset = $settings.offset;
    var busy = false;
    var initial = true;    //set to true only this one time when initialising
    ....

并编辑滚动处理程序中的检查:

if($settings.scroll == true) {
    $(window).scroll(function() {

    //only execute if either busy is false or initial is true
    if($(window).scrollTop() + $(window).height() > $this.height() && (!busy || initial) {

        if(initial && offset === 0){
            // set correct offset for the second call
            offset += $settings.nop;
        }
        initial = false; //set initial to false and not set it back to true anywhere else
    ....

这样第二次滚动调用将被执行,但具有正确的偏移量。