jQuery滚动加载更多数据


148

我只是想知道如何才能在div.loading可见的情况下在滚动上实现更多数据。

通常,我们寻找页面高度和滚动高度,以查看是否需要加载更多数据。但是下面的例子有点复杂。

下图是一个很好的例子。下拉框中有两个.loading div。当用户滚动内容时,无论哪个可见,都应开始为其加载更多数据。

在此处输入图片说明

那么,如何确定.loading div是否对用户可见?因此,我只能开始为该div加载数据。

Answers:


286

在jQuery中,使用滚动功能检查您是否已触及页面底部。一旦点击,进行ajax调用(您可以在此处显示加载图像,直到ajax响应为止)并获取下一组数据,然后将其追加到div。再次向下滚动页面时,将执行此功能。

$(window).scroll(function() {
    if($(window).scrollTop() == $(document).height() - $(window).height()) {
           // ajax call get data from server and append to the div
    }
});

5
这个解决方案很棒,最简单;)您可以在ajax调用中使用以下几行来改进此代码:new_element.hide().appendTo('.your_div').fadeIn(); $(window).scrollTop($(window).scrollTop()-1);第一行以很好的方式追加元素,第二行确保您的函数永远不会停在页面底部。
alekwisnia

34
我以类似的方式处理此问题,这是因为您总是在页面底部有任意内容(导航),并且您真的想在到达底部之前先进行加载。因此,我的内部功能是: var end = $("#BottomThing").offset().top; var viewEnd = $(window).scrollTop() + $(window).height(); var distance = end - viewEnd; if (distance < 300) // do load
Jeff Putz 2013年

2
瑞安·贝茨(Ryan Bates)对此有很出色的一集:railscasts.com/episodes/114-endless-page。还有一个修订版,但您可能需要订阅。
Vee 2014年

4
如果有人想知道用户是否已滚动到底部,则可以在此处显示的if内使用此if条件:if($(window).scrollTop()+ $(window).height()== $(document ).height()){console.log('滚动到底部!'); }
Roy Shoa 2015年

5
这个答案不是我在问题中问的。
2016年

84

您是否听说过jQuery Waypoint插件

以下是调用Waypoint插件并让页面加载更多内容后到达滚动条底部的简单方法:

$(document).ready(function() {
    var $loading = $("<div class='loading'><p>Loading more items&hellip;</p></div>"),
    $footer = $('footer'),
    opts = {
        offset: '100%'
    };

    $footer.waypoint(function(event, direction) {
        $footer.waypoint('remove');
        $('body').append($loading);
        $.get($('.more a').attr('href'), function(data) {
            var $data = $(data);
            $('#container').append($data.find('.article'));
            $loading.detach();
            $('.more').replaceWith($data.find('.more'));
            $footer.waypoint(opts);
        });
    }, opts);
});

8
通过jsfiddle进行演示的任何机会?
cwiggo 2014年

4
好的建议,但是最糟糕的js插件航路点..浪费了我很多时间..下面的答案要快得多n更快
Karan Datwani 2015年

2
您发现以下哪个答案是最好的?
wuno

您可以参考我的答案以了解Lazy Loader的实现。stackoverflow.com/a/45846766/2702249
Om Sao于2008年

9

这是一个例子:

  1. 滚动到底部时,将添加html元素。此附加机制仅执行两次,然后最后附加带有粉蓝色的按钮。

<!DOCTYPE html>
<html>
<head>
    <title>Demo: Lazy Loader</title>
    <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
    <style>
        #myScroll {
            border: 1px solid #999;
        }

        p {
            border: 1px solid #ccc;
            padding: 50px;
            text-align: center;
        }

        .loading {
            color: red;
        }
        .dynamic {
            background-color:#ccc;
            color:#000;
        }
    </style>
    <script>
		var counter=0;
        $(window).scroll(function () {
            if ($(window).scrollTop() == $(document).height() - $(window).height() && counter < 2) {
                appendData();
            }
        });
        function appendData() {
            var html = '';
            for (i = 0; i < 10; i++) {
                html += '<p class="dynamic">Dynamic Data :  This is test data.<br />Next line.</p>';
            }
            $('#myScroll').append(html);
			counter++;
			
			if(counter==2)
			$('#myScroll').append('<button id="uniqueButton" style="margin-left: 50%; background-color: powderblue;">Click</button><br /><br />');
        }
    </script>
</head>
<body>
    <div id="myScroll">
        <p>
            Contents will load here!!!.<br />
        </p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
    </div>
</body>
</html>


@RohanAshik:我刚刚检查过。工作正常 尝试向下滚动直到结尾。
Om Sao

@Om Prakash Sao它在这里工作正常,但是当我以崇高的方式运行此代码时,当滚动条到达顶部而不是底部时,该事件起作用,\
令人讨厌的

8

当窗口放大到> 100%时,这个问题的可接受答案与chrome有关。这是chrome开发人员推荐的代码,作为我在同一个错误中提出的一部分。

$(window).scroll(function() {
  if($(window).scrollTop() + $(window).height() >= $(document).height()){
     //Your code here
  }
});

以供参考:

相关的SO问题

Chrome Bug


7

如果您的文档没有全部滚动,例如,当您在文档中滚动时div,上述解决方案将无法进行修改。这是检查div的滚动条是否触底的方法:

$('#someScrollingDiv').on('scroll', function() {
    let div = $(this).get(0);
    if(div.scrollTop + div.clientHeight >= div.scrollHeight) {
        // do the lazy loading here
    }
});

多谢兄弟!这真的帮助了我:)
拉鲁

1

我花了一些时间试图找到一个很好的函数来包装解决方案。无论如何,最终我觉得在单个页面或整个站点上加载多个内容时,这是一个更好的解决方案。

功能:

function ifViewLoadContent(elem, LoadContent)
    {
            var top_of_element = $(elem).offset().top;
            var bottom_of_element = $(elem).offset().top + $(elem).outerHeight();
            var bottom_of_screen = $(window).scrollTop() + window.innerHeight;
            var top_of_screen = $(window).scrollTop();

            if((bottom_of_screen > top_of_element) && (top_of_screen < bottom_of_element)){
            if(!$(elem).hasClass("ImLoaded"))   {
                $(elem).load(LoadContent).addClass("ImLoaded");
            }
            }
            else {
               return false;
            }
        }

然后,您可以使用滚动窗口来调用该函数(例如,您也可以将其绑定到click等上,就像我也做的那样,因此是该函数):

使用方法:

$(window).scroll(function (event) {
        ifViewLoadContent("#AjaxDivOne", "someFile/somecontent.html"); 

        ifViewLoadContent("#AjaxDivTwo", "someFile/somemorecontent.html"); 
    });

这种方法也适用于div滚动等。我希望它能对您有所帮助,在上述问题中,您可以使用这种方法将您的内容加载到各个部分中,还可以追加并从而滴入所有图像数据,而不是批量输入。

我使用这种方法来减少https://www.taxformcalculator.com上的开销。如果您查看站点并检查元素等,它就解决了这个难题。您可以看到对Chrome中页面加载的影响(例如)。


1

在@deepakssn答案上有所改进。您可能希望在实际滚动到底部之前先加载一些数据。

var scrollLoad = true;
$(window).scroll(function(){
 if (scrollLoad && ($(document).height() - $(window).height())-$(window).scrollTop()<=800){
    // fetch data when we are 800px above the document end
    scrollLoad = false;
   }
  });

[var scrollLoad]用于阻止调用,直到添加了一个新数据。

希望这可以帮助。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.