【问题标题】:infinite-scroll jquery plugin无限滚动jQuery插件
【发布时间】:2011-06-30 21:06:30
【问题描述】:

我正在尝试在我正在使用 Coldfusion 开发的网站上设置无限滚动,我是 javascript 和 jquery 的新手,所以我遇到了一些问题。我是否需要在我的网站上进行分页才能使用无限滚动插件,或者有没有办法不用它?

【问题讨论】:

  • @francis 你所说的昂贵是什么意思。您不必将所有内容绑定到卷轴。这取决于想做什么。这是一个通用的例子。支持跨浏览器滚动。
  • 试试这个很棒的无限卷轴 - github.com/yairEO/infinite
  • @vsync 不是在责怪你,但是当你滚动时它似乎有点错误,对我来说,当我滚动它时它会从 20 跳到 40? Moz Firefox 仅供参考
  • @ShaunMoore - 取决于操作系统以及是否启用了平滑滚动。我在 6 年前设计了它,用于带有隐藏滚动条的设计,然后这种行为更有意义

标签: javascript jquery css infinite-scroll jquery-infinite-scroll


【解决方案1】:

你不需要无限滚动插件。要检测滚动何时到达页面末尾,您可以使用 jQuery 进行操作

$(window).scroll(function () { 
   if ($(window).scrollTop() >= $(document).height() - $(window).height() - 10) {
      //Add something at the end of the page
   }
});

JsFiddle 上的Demo

【讨论】:

  • 究竟为什么是 -10 常数?是滚动条中箭头的大小吗?
  • @bruno 滚动在页面结束前达到 10 像素时发生,而不需要在页面的最后。它不是必须的,但它可以更好地控制页面应该在什么点滚动。
  • 是否可以将其用于固定的DIV而不是页面?
  • @Hussein 谢谢这很简单很好,我可以简单地在上面的代码上调用我的 ajax
  • 好东西!我必须对较大的滚动区域触发器进行小幅修改。基本上我设置了一个触发器来防止连续追加,直到最后一个追加成功。在这里回答:stackoverflow.com/a/18090897/337903
【解决方案2】:

我在 Hussein 的小示例的基础上构建了一个 jQuery 小部件。它支持 localStorage 来临时保存追加的结果,并且它具有暂停功能以每隔一段时间停止追加,需要单击才能继续。

试一试:

http://www.hawkee.com/snippet/9445/

【讨论】:

  • 一个链接是不够的。请在此处复制/粘贴您的文章。
【解决方案3】:

我正在使用 Hussein 对 AJAX 请求的回答。我修改了代码以在 300 像素而不是 10 像素触发,但它开始导致我的追加在 AJAX 请求完成之前成倍增加,因为滚动调用在 300 像素范围内比在 10 像素范围内触发的频率更高。

为了解决这个问题,我添加了一个触发器,它会在成功加载 AJAX 时翻转。我的代码看起来更像这样:

var scrollLoad = true;

$(window).scroll(function () { 
  if (scrollLoad && $(window).scrollTop() >= $(document).height() - $(window).height() - 300) {
    scrollLoad = false;
    //Add something at the end of the page
  }
});

然后在我的 AJAX 响应中,我将 scrollLoad 设置为 true

【讨论】:

  • 我还得添加分页代码来完成效果。不难,但有一点需要注意。
  • 我用了这个方法。它工作正常。谢谢。但是在页面结束时会出现闪烁。这是数据库的最后一条记录。但是当用户尝试加载更多时,页面会闪烁。如何克服这个问题?
【解决方案4】:

我使用 Hussein 和 Nick 的想法编写了这个函数,但我希望它使用 promises 进行回调。如果将 div 发送到选项对象中,我还希望无限滚动区域位于固定 div 上,而不仅仅是窗口。在我下面的第二个链接中有一个例子。如果你想支持旧版浏览器,我建议使用像 Q 这样的 promise 库。 cb 方法可能是也可能不是一个承诺,无论如何它都会起作用。

这样使用:

html

<div id="feed"></div>

js

var infScroll = infiniteScroll({
    cb: function () {
        return doSomethingPossiblyAnAJAXPromise();     
    }
});

如果您希望 Feed 暂时停止,您可以在 cb 方法中返回 false。如果您已经到达提要的末尾,这很有用。可以通过调用infiniteScroll的返回对象方法'setShouldLoad'并传入true和example来重新启动它。

infScroll.setShouldLoad(true);

无限滚动的功能是这样的

function infiniteScroll (options) {
    // these options can be overwritten by the sent in options
    var defaultOptions = {
        binder: $(window), // parent scrollable element
        loadSpot: 300, //
        feedContainer: $("#feed"), // container
        cb: function () { },
    }

    options = $.extend(defaultOptions, options);
    options.shouldLoad = true;

    var returnedOptions = {
        setShouldLoad: function (bool) { options.shouldLoad = bool; if(bool) { scrollHandler(); } },
    };

    function scrollHandler () { 
        var scrollTop = options.binder.scrollTop();
        var height = options.binder[0].innerHeight || options.binder.height();
        if (options.shouldLoad && scrollTop >= (options.binder[0].scrollHeight || $(document).height()) - height - options.loadSpot) {
            options.shouldLoad = false;
            if(typeof options.cb === "function") {
                new Promise(function (resolve) {resolve();}).then(function() { return options.cb(); }).then(function (isNotFinished) {
                    if(typeof isNotFinished === "boolean") {
                        options.shouldLoad = isNotFinished;
                    }
                });
            }
        }
    }

    options.binder.scroll(scrollHandler);

    scrollHandler();

    return returnedOptions;

}

1 feed example with window as scroller

2 feed example with feed as scroller

【讨论】:

    【解决方案5】:
    $(function(){ 
        $(window).scroll(function(){
               if($(document).height()<=$(window).scrollTop()+$(window).height()+100){
                   alert('end of page');
               }
           });
    });
    

    有人要求解释,所以这里是解释

    这里的$(document).height()-->是整个文档的高度。大多数情况下,这等于当前文档的元素。

    $(window).height()-->是窗口(浏览器)的高度,表示您在浏览器上看到的任何内容的高度。

    $(window).scrollTop()-->Element.scrollTop 属性获取或设置元素内容向上滚动的像素数。元素的 scrollTop 是元素顶部到其最顶部可见内容的距离的度量。当元素内容不生成垂直滚动条时,其 scrollTop 值默认为 0。

    $(document).height()<=$(window).scrollTop()+$(window).height()+100
    

    添加 $(window).scrollTop() 和 $(window).height() 现在检查结果是否等于您的文档高度。如果相等,则表示您已到达末尾。我们也添加了 100,因为我想在文档底部的 100 像素之前检查(注意

    如有错误请指正

    【讨论】:

    • 虽然此答案可能是正确且有用的,但如果您 include some explanation along with it 解释它如何帮助解决问题,则最好。如果有变化(可能不相关)导致它停止工作并且用户需要了解它曾经是如何工作的,这在未来变得特别有用。谢谢!
    • 非常感谢您的解释。我必须了解工作背后的逻辑,而不仅仅是复制和粘贴代码。这几乎成了我的噩梦。非常感谢。
    【解决方案6】:

    如果你有一个可滚动的元素,比如带有滚动溢出的 div,但没有可滚动的文档/页面,你可以采用这种方式。

           $(function () {
                var s = $(".your-scrollable-element");
                var list = $("#your-table-list");
    
                /* On element scroll */
                s.scroll(function () {
                    /* The scroll top plus element height equals to table height */
                    if ((s.scrollTop() + s.height()) == list.height()) {
                        /* you code */
                    }
                });
            });
    

    【讨论】:

      【解决方案7】:

      我有同样的问题,但没有找到适合我需要的插件。所以我写了以下代码。此代码通过使用 ajax 和分页获取数据将模板附加到元素。 为了检测用户何时滚动到 div 的底部,我使用了这个条件:

      var t = $("#infiniteContent").offset().top;
      var h = $("#infiniteContent").height();
      var ws = $(window).scrollTop();
      var dh = $(document).height();
      var wh = $(window).height();
      
      if (dh - (wh + ws) < dh - (h + t)) {
          //now you are at bottom of #infiniteContent element
      }
      

      $(document).ready(function(){
      	$.getJSON("https://jsonplaceholder.typicode.com/comments", { _page: 1, _limit:3 }, function (jsonre) {
              appendTemplate(jsonre,1);
          });
      });
      
      function appendTemplate(jsonre, pageNumber){
      	//instead of this code you can use a templating plugin like "Mustache"
      	for(var i =0; i<jsonre.length; i++){
        	$("#infiniteContent").append("<div class='item'><h2>"+jsonre[i].name+"</h2><p>"+jsonre[i].body+"</p></div>");
        }
      
        if (jsonre.length) {
          $("#infiniteContent").attr("data-page", parseInt(pageNumber)+1);
          $(window).on("scroll", initScroll);
          
          //scroll event will not trigger if window size is greater than or equal to document size
          var dh = $(document).height() , wh = $(window).height();
          if(wh>=dh){
          	initScroll();
          }
        }
        else {
          $("#infiniteContent").attr("data-page", "");
        }
      }
      
      function initScroll() {
          var t = $("#infiniteContent").offset().top;
          var h = $("#infiniteContent").height();
          var ws = $(window).scrollTop();
          var dh = $(document).height();
          var wh = $(window).height();
      
          if (dh - (wh + ws) < dh - (h + t)) {
              $(window).off('scroll');
              var p = $("#infiniteContent").attr("data-page");
              if (p) {
                  $.getJSON("https://jsonplaceholder.typicode.com/comments", { _page: p, _limit:3 }, function (jsonre) {
                      appendTemplate(jsonre, p);
                  });
              }
          }
      }
      <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
      <div id="infiniteContent"></div>

      【讨论】:

      • 这真的很有用。不要仅仅因为它不是最佳答案而低估这个答案。它工作得恰到好处,而且速度非常快。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-23
      • 2014-10-06
      • 2011-03-02
      • 2012-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多