iPad Web 应用程序:在 Safari 中使用 JavaScript 检测虚拟键盘?

IT技术 javascript iphone ipad safari web-applications
2021-02-01 11:34:08

我正在为 iPad 编写一个网络应用程序(不是一个普通的 App Store 应用程序——它是使用 HTML、CSS 和 JavaScript 编写的)。由于键盘占据了屏幕的很大一部分,因此在显示键盘时更改应用程序的布局以适应剩余空间是有意义的。但是,我发现无法检测何时或是否显示键盘。

我的第一个想法是假设当文本字段具有焦点时键盘是可见的。但是,当外部键盘连接到 iPad 时,当文本字段获得焦点时,虚拟键盘不会显示。

在我的实验中,键盘也没有影响任何 DOM 元素的高度或滚动高度,而且我没有发现指示键盘是否可见的专有事件或属性。

6个回答

我找到了一个有效的解决方案,虽然它有点难看。它也不适用于所有情况,但对我有用。由于我将用户界面的大小调整为 iPad 的窗口大小,因此用户通常无法滚动。换句话说,如果我设置了窗口的 scrollTop,它将保持为 0。

另一方面,如果显示键盘,滚动会突然起作用。所以我可以设置scrollTop,立即测试它的值,然后重置它。以下是使用 jQuery 的代码中的样子:

$(document).ready(function(){
    $('input').bind('focus',function() {
        $(window).scrollTop(10);
        var keyboard_shown = $(window).scrollTop() > 0;
        $(window).scrollTop(0);

        $('#test').append(keyboard_shown?'keyboard ':'nokeyboard ');
    });
});

通常,您希望这对用户不可见。不幸的是,至少在模拟器中运行时,iPad 明显(虽然很快)再次上下滚动。尽管如此,它仍然有效,至少在某些特定情况下是这样。

我已经在 iPad 上测试过了,它似乎工作正常。

@theSociableme:这个解决方案的重点是正确处理蓝牙键盘。如果您忽略蓝牙键盘,确定虚拟键盘是否显示会很容易,因为您只需检查一个字段是否有焦点。
2021-03-20 11:34:08
@fraxture:不知道一个全面的解释(如果你研究和写一个,我很乐意阅读)。这两个平台在其主浏览器中处理屏幕键盘的方式非常不同。Android Chrome 会缩小视口高度以为键盘腾出空间,因此页面会在显示键盘时调整大小。iOS Safari 使用键盘覆盖页面(页面大小保持不变),并更改滚动的工作方式。Safari 既在视口内滚动页面,又同时移动视口,确保页面底部在一直向下滚动时位于键盘上方。
2021-03-21 11:34:08
我还没有尝试过这个,但看起来很有希望。不会.scrollTop(1)工作得一样好并且不那么明显吗?
2021-03-28 11:34:08
我的网络应用程序出现问题,当输入聚焦时,屏幕会向上滚动一点。我已经禁用了滚动,但仍然滚动。有任何想法吗?谢谢 [ stackoverflow.com/questions/6740253/...
2021-03-31 11:34:08
这是个坏主意……键盘可能是蓝牙的,虚拟的可能不会显示。
2021-04-10 11:34:08

您可以使用focusout事件来检测键盘关闭这就像模糊,但气泡。它会在键盘关闭时触发(当然在其他情况下也是如此)。在 Safari 和 Chrome 中,事件只能使用 addEventListener 注册,而不能使用旧方法注册。这是我用来在键盘关闭后恢复 Phonegap 应用程序的示例。

 document.addEventListener('focusout', function(e) {window.scrollTo(0, 0)});

如果没有此代码段,应用程序容器将保持在向上滚动的位置,直到页面刷新。

不,不幸的是,这并没有解决最初的问题,因为它focusout是在由于任何原因失去焦点时触发的。因此,它无助于确定虚拟键盘是否曾经打开过,或者是否使用了外部键盘并且该字段在没有使用虚拟键盘的情况下具有焦点。
2021-03-12 11:34:08
您也可以使用“focusin”版本来检测键盘打开。
2021-03-15 11:34:08
我为我的问题找到的最佳解决方案
2021-03-31 11:34:08

如果有屏幕键盘,聚焦靠近视口底部的文本字段将导致 Safari 将文本字段滚动到视图中。可能有一些方法可以利用这种现象来检测键盘的存在(页面底部有一个微小的文本字段,可以暂时获得焦点,或者类似的东西)。

太棒了!你救了我的一天!
2021-03-22 11:34:08
这是一个巧妙的想法。我找到了一个类似的解决方案,它也使用当前滚动位置来检测虚拟键盘。
2021-04-09 11:34:08

也许更好的解决方案是在各种输入字段上绑定(在我的情况下使用 jQuery)“模糊”事件。

这是因为当键盘消失时,所有表单域都变得模糊了。所以对于我的情况,这个剪辑解决了这个问题。

$('input, textarea').bind('blur', function(e) {

       // Keyboard disappeared
       window.scrollTo(0, 1);

});

希望能帮助到你。米歇尔

感谢您的回答。我发现解决 iPad Safari 键盘导致 textarea 光标在 textarea 外位移(偏移)的问题很有用。
2021-03-26 11:34:08

在焦点事件期间,您可以滚动超过文档高度,并且 window.innerHeight 会神奇地减少虚拟键盘的高度。请注意,横向和纵向的虚拟键盘大小不同,因此您需要在它发生变化时重新检测它。我建议不要记住这些值,因为用户可以随时连接/断开蓝牙键盘。

var element = document.getElementById("element"); // the input field
var focused = false;

var virtualKeyboardHeight = function () {
    var sx = document.body.scrollLeft, sy = document.body.scrollTop;
    var naturalHeight = window.innerHeight;
    window.scrollTo(sx, document.body.scrollHeight);
    var keyboardHeight = naturalHeight - window.innerHeight;
    window.scrollTo(sx, sy);
    return keyboardHeight;
};

element.onfocus = function () {
    focused = true;
    setTimeout(function() { 
        element.value = "keyboardHeight = " + virtualKeyboardHeight() 
    }, 1); // to allow for orientation scrolling
};

window.onresize = function () {
    if (focused) {
        element.value = "keyboardHeight = " + virtualKeyboardHeight();
    }
};

element.onblur = function () {
    focused = false;
};

请注意,当用户使用蓝牙键盘时,keyboardHeight 为 44,即 [previous][next] 工具栏的高度。

进行此检测时会出现一点点闪烁,但似乎无法避免。

virtualKeyboardHeight 功能帮助我避免滚动离开搜索字段,该字段在移动设备上键入时会全屏显示。当输入字段在屏幕的下 60% 内时,它总是被键盘推出屏幕。我尝试过的其他滚动功能根本没有帮助。
2021-03-13 11:34:08
也没有为我工作 - 在 iOS9.3 中没有触发调整大小
2021-03-27 11:34:08
我刚刚在 iOS 8.2 中尝试过这个,但它不起作用......它在新 iOS 的某个阶段停止工作了吗?
2021-03-31 11:34:08