我有一个使用HTML5/Javascript(Sencha)构建的应用程序,我已经将其打包到XCode中的PhoneGap中以在iOS上运行。无论如何,我希望能够监听键盘的打开/关闭事件并相应地进行一些操作。是否有任何方法可以实现这一点?
我有一个使用HTML5/Javascript(Sencha)构建的应用程序,我已经将其打包到XCode中的PhoneGap中以在iOS上运行。无论如何,我希望能够监听键盘的打开/关闭事件并相应地进行一些操作。是否有任何方法可以实现这一点?
当您聚焦于文本输入框、文本域时,键盘会自动弹出。因此,您可以在JavaScript中创建监听器以侦听 focus 事件,这类似于侦听键盘打开事件。同样,您也可以使用 blur 监听器来处理键盘关闭。
谢谢。
最近我也遇到了一个类似的问题。经过一些研究,我发现“视觉视口API”是解决方法。
“视觉视口是屏幕上可见的部分,不包括屏幕键盘、缩放区域外的区域或任何不随页面尺寸变化而缩放的其他屏幕工件。”
https://developer.mozilla.org/en-US/docs/Web/API/Visual_Viewport_API
window.visualViewport.addEventListener('resize', event => console.log(event.target));
每当“可视窗口”调整大小时,例如键盘打开/关闭时,以上代码将被执行。
我遇到了同样的问题,我认为在您的情况下最好的解决方案是使用PhoneGap插件来绑定原生事件,就像这个:
https://github.com/driftyco/ionic-plugins-keyboard/tree/60b803617af49a10aff831099db90340e5bb654c
它在Android和iOS上都有很好的效果,只需绑定这些事件:
window.addEventListener('native.showkeyboard', keyboardShowHandler);
window.addEventListener('native.hidekeyboard', keyboardHideHandler);
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0, minimal-ui">
<title>Detect keyboard opened/closed event</title>
</head>
<body>
<textarea id="txta" onclick="xfocus()" onblur="xblur()"></textarea><br>
<span id="status" style="background: yellow; width: auto;">closed</span>
<script type="text/javascript">
function xfocus() {
setTimeout(function() {
height_old = window.innerHeight;
window.addEventListener('resize', xresize);
document.getElementById('status').innerHTML = 'opened'; // do something instead this
}, 500);
}
function xresize() {
height_new = window.innerHeight;
var diff = Math.abs(height_old - height_new);
var perc = Math.round((diff / height_old) * 100);
if (perc > 50)
xblur();
}
function xblur() {
window.removeEventListener('resize', xresize);
document.getElementById('status').innerHTML = 'closed'; // do something instead this
}
</script>
</body>
</html>
window.visualViewport
。
我在几个设备上打开键盘时测量了视口是屏幕的可视部分,不包括屏幕键盘、缩放区域外的区域或任何不随页面尺寸变化而缩放的其他屏幕工件。
window.screen.height
和window.visualViewport.height
之间的差异,它总是大于300px
。const listener = () => {
const MIN_KEYBOARD_HEIGHT = 300 // N.B.! this might not always be correct
const isMobile = window.innerWidth < 768
const isKeyboardOpen = isMobile
&& window.screen.height - MIN_KEYBOARD_HEIGHT > window.visualViewport.height
}
window.visualViewport.addEventListener('resize', listener)
另一个可能的(但非常hacky的)解决方案是监听窗口调整大小事件。它不适用于所有用例,但在智能手机上,调整窗口大小并不常见,因此调整大小事件很可能来自键盘打开。这段代码未经测试,但它说明了一般思路:
let fullWindowHeight = window.innerHeight;
let keyboardIsProbablyOpen = false;
window.addEventListener("resize", function() {
if(window.innerHeight == fullWindowHeight) {
keyboardIsProbablyOpen = false;
} else if(window.innerHeight < fullWindowHeight*0.9) {
keyboardIsProbablyOpen = true;
}
});
结合焦点/失焦事件使用可能有助于帮助(例如)检测用户按下返回按钮时键盘关闭(如@filipvkovic所指出的那样)。
hidekeyboard
和showkeyboard
。您可能需要检查它们是否也适用于iOS平台。