jQuery/JS、iOS 4 和 $(document).height() 问题

IT技术 javascript ios4 webkit window
2021-02-11 09:53:25

我遇到了一个奇怪的问题,似乎是各种版本的 Webkit 浏览器。我试图将一个元素放置在屏幕的中心并进行计算,我需要获得各种尺寸,特别是身体的高度和屏幕的高度。在 jQuery 中,我一直在使用:

var bodyHeight = $('body').height();
var screenHeight = $(window).height();

我的页面通常比实际视口高得多,所以当我“提醒”这些变量时,bodyHeight 最终应该很大,而 screenHeight 应该保持不变(浏览器视口的高度)。

这是真的 - Firefox - Chrome 15(哇!Chrome 什么时候达到 15 版?) - iOS5 上的 Safari

这不适用于: - iOS4 上的 Safari - Safari 5.0.4

在后两者上,$(window).height();总是返回相同的值$('body').height()

认为这可能是一个 jQuery 问题,我换掉了窗口高度,window.outerHeight但这也做了同样的事情,让我认为这实际上是某种 webkit 问题。

有没有人遇到过这个问题并知道解决这个问题的方法?

更复杂的是,我似乎无法孤立地复制这一点。例如:http : //jsbin.com/omogap/3工作正常。

我已经确定这不是 CSS 问题,所以也许我需要找到其他对这个特定浏览器造成严重破坏的 JS。

5个回答

我已经与这个问题斗争了很长时间(因为我的插件错误)并且我找到了如何在 Mobile Safari 中获得适当的窗口高度的方法。

无论缩放级别是多少,它都可以正常工作,而无需减去具有预定义状态栏高度的屏幕高度(将来可能会发生变化)。它适用于 iOS6 全屏模式。

一些测试(在屏幕尺寸为 320x480 的 iPhone 上,横向模式下):

// Returns height of the screen including all toolbars
// Requires detection of orientation. (320px for our test)
window.orientation === 0 ? screen.height : screen.width


// Returns height of the visible area
// It decreases if you zoom in
window.innerHeight


// Returns height of screen minus all toolbars
// The problem is that it always subtracts it with height of the browser bar, no matter if it present or not
// In fullscreen mode it always returns 320px. 
// Doesn't change when zoom level is changed.
document.documentElement.clientHeight 

iOS 窗口高度

以下是检测高度的方法:

var getIOSWindowHeight = function() {
    // Get zoom level of mobile Safari
    // Note, that such zoom detection might not work correctly in other browsers
    // We use width, instead of height, because there are no vertical toolbars :)
    var zoomLevel = document.documentElement.clientWidth / window.innerWidth;

    // window.innerHeight returns height of the visible area. 
    // We multiply it by zoom and get out real height.
    return window.innerHeight * zoomLevel;
};

// You can also get height of the toolbars that are currently displayed
var getHeightOfIOSToolbars = function() {
    var tH = (window.orientation === 0 ? screen.height : screen.width) -  getIOSWindowHeight();
    return tH > 1 ? tH : 0;
};

这种技术只有一个缺点:当页面放大时它不是像素完美的(因为window.innerHeight总是返回四舍五入的值)。当您在顶部栏附近放大时,它也会返回不正确的值。

自从你问这个问题一年过去了,但无论如何希望这会有所帮助!:)

我有一个类似的问题。它与两件事有关:

Box-sizing CSS3 属性:.height() jQuery 文档中,我发现了这个:

请注意, .height() 将始终返回内容高度,无论 CSS box-sizing 属性的值如何。从 jQuery 1.8 开始,这可能需要检索 CSS 高度加上 box-sizing 属性,然后在元素具有 box-sizing:border-box 时减去每个元素上的任何潜在边框和填充。为了避免这种惩罚,请使用 .css("height") 而不是 .height()。

这可能适用于$('body').height().

文档就绪 vs Window.load

$(document).ready()当 DOM 准备好用于 JS 时运行,但图像可能尚未完成加载。使用$(window).load()解决了我的问题。阅读更多

我希望这有帮助。

你绝对有帮助,至少为我节省了几个小时。
2021-03-20 09:53:25

现在是 2015 年,我们现在在 iOS 8 上。iOS 9 已经迫在眉睫。这个问题仍然存在于我们身上。叹。

我已经为jQuery.documentSize 中的窗口大小实现了一个跨浏览器的解决方案它远离任何类型的浏览器嗅探,并且已经过大量的单元测试。这是它的工作原理:

  • 调用视觉视口$.windowHeight()的高度这是您在当前缩放级别在视口中实际看到的区域的高度,以 CSS 像素为单位。
  • 调用布局视口$.windowHeight( { viewport: "layout" } )的高度这是可见区域在 1:1 缩放时的高度 - “原始窗口高度”。

只需为您的任务选择合适的视口,您就完成了。

在幕后,计算大致遵循@DmitrySemenov答案中概述的过程我已经写过关于SO 其他地方涉及的步骤如果您有兴趣,请查看它,或者查看源代码

@Gavin 感谢您的反馈。
2021-03-24 09:53:25
你的图书馆很好用,谢谢!顺便说一句,$.windowHeight( { viewport: "layout" } )是什么为我解决了 iphone 问题。
2021-04-13 09:53:25

试试这个 :

var screenHeight = (typeof window.outerHeight != 'undefined')?Math.max(window.outerHeight, $(window).height()):$(window).height()

跨浏览器解决方案由 jQuery 设置

使用此属性: $(window).height()

这将返回一个 int 值,该值表示以像素为单位的浏览器可见屏幕高度的大小。

关键是 jQuery 中有一个错误,$(window).height()在 iOS 中不起作用。
2021-03-15 09:53:25
但是,正如您在问题中会注意到的那样,情况并非如此……至少在我写问题时并非如此。也许它在较新版本的 jQuery 中得到了更好的处理。我应该回去重新测试。
2021-03-18 09:53:25
似乎仍然关闭 - 2014 年 5 月 - 它是 jquery 的“不会修复”。bugs.jquery.com/ticket/6724
2021-03-28 09:53:25