我正在制作一个分页系统(有点像 Facebook),当用户滚动到底部时会加载内容。我想最好的方法是找到用户何时位于页面底部并运行 Ajax 查询以加载更多帖子。
唯一的问题是我不知道如何检查用户是否已滚动到页面底部。有任何想法吗?
我正在使用 jQuery,因此请随时提供使用它的答案。
我正在制作一个分页系统(有点像 Facebook),当用户滚动到底部时会加载内容。我想最好的方法是找到用户何时位于页面底部并运行 Ajax 查询以加载更多帖子。
唯一的问题是我不知道如何检查用户是否已滚动到页面底部。有任何想法吗?
我正在使用 jQuery,因此请随时提供使用它的答案。
在.scroll()
上使用事件window
,如下所示:
$(window).scroll(function() {
if($(window).scrollTop() + $(window).height() == $(document).height()) {
alert("bottom!");
}
});
你可以在这里测试,这需要窗口的顶部滚动,所以它向下滚动了多少,添加可见窗口的高度并检查它是否等于整体内容的高度 ( document
)。如果你想检查用户是否靠近底部,它看起来像这样:
$(window).scroll(function() {
if($(window).scrollTop() + $(window).height() > $(document).height() - 100) {
alert("near bottom!");
}
});
您可以在此处测试该版本,只需将其调整100
为您想要触发的底部像素即可。
我不确定为什么这还没有发布,但根据MDN 的文档,最简单的方法是使用本机 javascript 属性:
element.scrollHeight - element.scrollTop === element.clientHeight
当您位于任何可滚动元素的底部时返回 true。所以只需使用javascript:
element.addEventListener('scroll', function(event)
{
var element = event.target;
if (element.scrollHeight - element.scrollTop === element.clientHeight)
{
console.log('scrolled');
}
});
scrollHeight
在浏览器中得到广泛支持,从 ie 8 到更精确,而clientHeight
和scrollTop
都受到所有人的支持。即使 ie 6。这应该是跨浏览器安全的。
Nick Craver 的回答工作正常,避免了值$(document).height()
因浏览器而异的问题。
要使其适用于所有浏览器,请使用James Padolsey 的此功能:
function getDocHeight() {
var D = document;
return Math.max(
D.body.scrollHeight, D.documentElement.scrollHeight,
D.body.offsetHeight, D.documentElement.offsetHeight,
D.body.clientHeight, D.documentElement.clientHeight
);
}
代替$(document).height()
,所以最终的代码是:
$(window).scroll(function() {
if($(window).scrollTop() + $(window).height() == getDocHeight()) {
alert("bottom!");
}
});
对于那些使用尼克的解决方案并获得重复警报/事件触发的人,您可以在警报示例上方添加一行代码:
$(window).scroll(function() {
if($(window).scrollTop() + $(window).height() > $(document).height() - 100) {
$(window).unbind('scroll');
alert("near bottom!");
}
});
这意味着代码只会在您第一次到达文档底部 100 像素以内时触发。如果您向上滚动然后向下滚动,它就不会重复,这可能有用也可能没有用,具体取决于您使用 Nick 代码的目的。
除了 Nick Craver 出色的公认答案之外,您还可以限制滚动事件,使其不会被频繁触发,从而提高浏览器性能:
var _throttleTimer = null;
var _throttleDelay = 100;
var $window = $(window);
var $document = $(document);
$document.ready(function () {
$window
.off('scroll', ScrollHandler)
.on('scroll', ScrollHandler);
});
function ScrollHandler(e) {
//throttle event:
clearTimeout(_throttleTimer);
_throttleTimer = setTimeout(function () {
console.log('scroll');
//do work
if ($window.scrollTop() + $window.height() > $document.height() - 100) {
alert("near bottom!");
}
}, _throttleDelay);
}