使用 jQuery 检测用户何时滚动到 div 的底部

IT技术 javascript jquery
2021-01-21 13:54:02

我有一个 div 框(称为flux),里面有不同数量的内容。此 divbox 的溢出设置为自动。

现在,我想要做的是,当使用滚动到此 DIV 框的底部时,将更多内容加载到页面中,我知道如何执行此操作(加载内容)但我不知道如何检测用户何时滚动到 div 标签的底部?如果我想为整个页面执行此操作,我会使用 .scrollTop 并将其从 .height 中减去。

但我似乎不能在这里这样做?

我尝试从flux中获取.scrollTop,然后将所有内容包装在一个名为inner的div中,但是如果我获取flux的innerHeight,它会返回564px(div设置为500作为高度)和'innner'的高度它返回 1064,当 div 底部显示 564 时,scrolltop 返回。

我能做什么?

6个回答

您可以使用一些属性/方法:

$().scrollTop()//how much has been scrolled
$().innerHeight()// inner height of the element
DOMElement.scrollHeight//height of the content of the element

所以你可以取前两个属性的总和,当它等于最后一个属性时,你就到了最后:

jQuery(function($) {
    $('#flux').on('scroll', function() {
        if($(this).scrollTop() + $(this).innerHeight() >= $(this)[0].scrollHeight) {
            alert('end reached');
        }
    })
});

http://jsfiddle.net/doktormolle/w7X9N/

编辑:我已将“绑定”更新为“开启”,如下所示:

从 jQuery 1.7 开始, .on() 方法是将事件处理程序附加到文档的首选方法。

注意:当用户在浏览器上使用缩放级别时,这可能不起作用。缩放导致innerHeight()报告小数。在一个用户的情况下缩小,总和scrollTop()innerHeight()将总是至少的一小部分短scrollHeight我最终添加了一个 20px 的缓冲区。结果条件是if(el.scrollTop() + el.innerHeight() >= el[0].scrollHeight - 20)where elequals $(this)
2021-03-11 13:54:02
当 DOM 准备好以确保 #flux-element 已经可用时,它将进行绑定。
2021-03-18 13:54:02
这是有史以来对我来说非常有效的最佳答案。谢谢
2021-03-25 13:54:02
它不再工作了,你能确认为什么它不工作,谢谢
2021-03-25 13:54:02
你应该使用 ON 而不是 bind 来更新你的答案,bind 已被弃用而支持 On
2021-04-08 13:54:02

我找到了一个解决方案,当您滚动窗口并从底部显示的 div 结束时,会向您发出警报。

$(window).bind('scroll', function() {
    if($(window).scrollTop() >= $('.posts').offset().top + $('.posts').outerHeight() - window.innerHeight) {
        alert('end reached');
    }
});

在这个例子中,如果你在 div ( .posts) 完成时向下滚动它会给你一个警报。

@1616 我var running = false在此之前声明了一个变量在条件中,我检查了if(!running) { running = true; // and continue logic } 这种方式它只被调用一次!当 AJAX 完成时,设置running = false;
2021-03-16 13:54:02
谢谢你,但是当它到达那个 div 的底部时,我怎样才能让 div 动画?同样,当您向上滚动时,会检测到该 div 的顶部,然后也进行动画处理。就像这个网站上的lazada.com.ph/apple侧边栏行为希望你能帮助我:)
2021-03-22 13:54:02
这是关于窗口,但问题是关于 div。
2021-03-27 13:54:02
它的工作原理很神奇,但问题是警报执行了两次,因此如果您调用内部函数,它将被执行两次
2021-04-08 13:54:02

尽管这个问题是在 5.5 年前提出的,但它在今天的 UI/UX 上下文中仍然非常重要。我想加上我的两分钱。

var element = document.getElementById('flux');
if (element.scrollHeight - element.scrollTop === element.clientHeight)
    {
        // element is at the end of its scroll, load more content
    }

来源:https : //developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight#Determine_if_an_element_has_been_totally_scrolled

某些元素不允许您滚动元素的整个高度。在这些情况下,您可以使用:

var element = docuement.getElementById('flux');
if (element.offsetHeight + element.scrollTop === element.scrollHeight) {
  // element is at the end of its scroll, load more content
}
有事件处理程序吗?
2021-03-25 13:54:02
@AlexanderVolkov onscroll 是相关事件。
2021-03-29 13:54:02
如果您不使用 jQuery,这就是您正在寻找的解决方案。
2021-03-31 13:54:02

这里只是一个附加说明,因为我在寻找我想要滚动的固定 div 的解决方案时发现了这一点。对于我的场景,我发现最好考虑 div 上的填充,这样我就可以准确地结束。所以扩展@Dr.Molle 的回答,我添加以下内容

$('#flux').bind('scroll', function() {
    var scrollPosition = $(this).scrollTop() + $(this).outerHeight();
    var divTotalHeight = $(this)[0].scrollHeight 
                          + parseInt($(this).css('padding-top'), 10) 
                          + parseInt($(this).css('padding-bottom'), 10)
                          + parseInt($(this).css('border-top-width'), 10)
                          + parseInt($(this).css('border-bottom-width'), 10);

    if( scrollPosition == divTotalHeight )
    {
      alert('end reached');
    }
  });

这将为您提供精确的位置,包括填充和边框

不过这对我有用

$(window).scroll(function() {
  if ($(window).scrollTop() >= (($(document).height() - $(window).height()) - $('#divID').innerHeight())) {
    console.log('div reached');
  }
});