【问题标题】:Calculation Discrepancy using jQuery.height() between window and body在窗口和正文之间使用 jQuery.height() 计算差异
【发布时间】:2012-12-13 03:26:25
【问题描述】:

我有兴趣确定用户何时到达页面底部以触发自定义回调事件,类似于“无限滚动”或“无限滚动”。

关于如何解决这个问题,我最好的理论是首先计算 body 元素的高度:

var bodyHeight = $('body').outerHeight();

接下来,测量窗框的高度:

var winHeight = $(window).height();

最后确定垂直滚动位置:

var scrollY = $(window).scrollTop();

但是,当我将此脚本插入正文时:

<script>
console.log(bodyHeight, winHeight);
$(window).bind("scroll", function(){
console.log(winHeight + scrollY);
});
</script>

我经常会看到计算出来的滚动位置超过了body的高度。我在使用带有“弹性滚动”的 OSX 时看到了类似的东西,但这只是使用标准的滚动条 ui。

有什么想法吗?

【问题讨论】:

    标签: jquery dom pagination height infinite-scroll


    【解决方案1】:

    我认为如果你坚持使用 $('body').height(),你应该没问题。

    $('body').height() - $(window).height() == $('body').scrollTop()
    

    如果您有 position:absolute、position:fixed 或 float 元素,您可能会看到 scrollTop() 已关闭。在这种情况下,你的 body 元素实际上并没有包裹最高的元素,所以它不起作用。

    如果是这样,您实际上可以使用scrollHeight。

    document.body.scrollHeight - $(window).height() == $('body').scrollTop()
    

    看起来 jQuery 没有 scrollHeight 方法(或等效方法),并且存在一些浏览器兼容性问题 (W3C Dom Compatibility for scrollHeight),但它适用于所有现代浏览器。

    最坏的情况,您可以获取所有元素,循环遍历它们以找到最大高度,然后将其用于:

    var maxHeight = ((function() { var maxHeight = 0; $('*').each(function() {
        maxHeight = Math.max($(this).height(), maxHeight);
    }); return maxHeight; })());
    
    maxHeight - $(window).height() == $('body').scrollTop()
    

    如果您使用这种方法,我强烈建议您缓存该值并仅在需要时更新它。

    JSFiddle

    【讨论】:

    • 没有浮动元素稍后不会被清除,因此不应该有任何元素折叠会影响bodyHeight。核心问题是 winHeight + scrollY 最终大于计算出的 .outerHeight() (包括边距、填充、边框,如果适用),因此没有可靠的方法来使用比较运算符触发回调只有一次。差异可以忽略不计,奇怪的是只有大约 7px。仅供参考,api.jquery.com/innerHeight 与 scrollHeight 类似,因为它考虑填充但不考虑边框或边距。
    • scrollHeight 与关闭元素无关,因为它使用的值与滚动条使用的值相同(当它可用时)。如果您可以提供一些导致神秘问题的 HTML 或浏览器,我们也许能够解决问题。我不确定你为什么选择 outerHeight() 和 height()。
    • 对于它的价值,这是我想出的解决方案:github.com/oomlaut/addPageBottomListener
    猜你喜欢
    • 2019-04-07
    • 2017-06-23
    • 2022-08-06
    • 1970-01-01
    • 2023-03-21
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多