16

现在这个问题已经出现在这里(iPad的屏幕键盘高度是多少?),但我认为由于最近发布的iOS7,它需要复习一下。

问题: 我有一个出现在页面右下角的固定位置模式。它有一个表单字段,当模式打开时获得焦点。焦点触发软键盘打开。问题是我想以编程方式检测键盘高度以将模式定位在键盘顶部,否则模式的一部分会从视图中截断。

我试过的:

    var scrollHere = currentWidget.offset().top;
    //this scrolls the page to the top of the widget, but the keyboard is below.
    setTimeout(function() {
        $('html, body').scrollTop(scrollHere);
    }, 0);

页面滚动到模式的顶部。不理想,因为有时表单字段隐藏在键盘下方。

我也尝试过提醒 window.innerHeight

    alert(window.innerHeight);

但是无论键盘是否可见,这都是一样的。

所以我的问题是,有没有人找到一种方法来检测 JavaScript 中的 iOS7 键盘高度?可能有解决方法吗?不太可能,但这可能是 iOS7 Safari 中的错误吗?

任何帮助,将不胜感激。谢谢你。

4

1 回答 1

11

所以答案是,我错了无法检测到 window.innerHeight 的变化。

我无法检测到更改的原因是因为在 iPad 上,键盘从底部向上动画并且不会触发窗口调整大小事件。我的解决方案不是检测窗口大小,当模态打开时,我使主体的最大高度为 100%。然后我等待用户专注于文本字段并在该点操作滚动位置:

$(document.body).on('focus', '.input-field', function(){
    setTimeout(function(){
         window.scrollTo(0, $('#modalInput').offset().top - 100);
    }, 0);
});

这适用于您专注于输入字段时。iOS 喜欢在键盘打开时尝试将窗口居中放在字段上,如果说您在用户需要查看的输入上方有信息,那可能会很烦人。上面的示例滚动窗口,使我的文本字段位于键盘正上方。你会认为这就是你需要做的所有事情,但 iOS 有时会试图变得太聪明。当用户开始输入输入时,它会再次以输入为中心!所以我们把上面的代码做成这样:

$(document.body).on('focus keyup', '.input-field', function(){
    setTimeout(function(){
         window.scrollTo(0, $('#modalInput').offset().top - 100);
    }, 0);
});

这样,当用户键入时,滚动位置永远不会从您想要的位置改变。

注意:我唯一一次能够检测到 window.innerHeight 的变化是在 on keyup 事件中,因为此时键盘已完成动画并完全显示在页面上。在焦点上它仍然说 innerHeight 与没有键盘时相同。

于 2013-10-09T13:05:25.023 回答