XCodeでiOS用PhoneGapにパックしたHTML5/Javascript(Sencha)アプリがあります。どういうわけか、キーボードの開閉イベントを聞いて、それに応じて何かをしたいと思っています。これを行う方法はありますか?
Textfield、textareafield ...にフォーカスしている間、キーボードが自動的に呼び出されます。したがって、キーボードのopenイベントをリッスンするのと同様に、JavaScriptでfocusイベントのリスナーを作成できます。また、blurリスナーを使用して、キーボードのクローズを処理することもできます。
ありがとう。
同じ問題が発生しました。あなたの場合の最善の解決策は、次のようなネイティブイベントをバインドするPhoneGapプラグインを使用することだと思います。
https://github.com/driftyco/ionic-plugins-keyboard/tree/60b803617af49a10aff831099db90340e5bb654c
AndroidとiOSでも同じように機能し、これらのイベントをバインドするだけです。
window.addEventListener('native.showkeyboard', keyboardShowHandler);
window.addEventListener('native.hidekeyboard', keyboardHideHandler);
オープンステータスのトリガーは、onclickまたはonfocusイベントを使用して簡単ですが、キーボードを閉じるときにonblurイベントは発生しません(カーソルが入力/テキスト領域に残っているため)。そこで、キーボードの開閉で大きく変化するウィンドウの高さを検出することで解決策を見つけました。
AndroidおよびiOSでも最新のブラウザで動作しています。デモ: http://jsfiddle.net/qu1ssabq/3/
必要に応じて、addEventListenerまたはinnerHeightをサポートしないデバイスのコードを改善できます。インターネット上に利用可能な代替手段があります。
<!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>
もう1つの潜在的な(しかし非常にハッキーな)解決策は、ウィンドウのサイズ変更イベントを監視することです。すべてのユースケースで機能するわけではありませんが、スマートフォンではウィンドウのサイズを変更することはあまり一般的ではないため、サイズ変更イベントはキーボードの開口部から発生する可能性があります。このコードはテストされていませんが、一般的な考え方を示しています。
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で指摘されています)。
私が見る限り、これはPhoneGapのAndroidビルドでのみ可能です。ここでプルリクエストを参照してください: https://github.com/phonegap/phonegap-Android/課題/ 94 。
イベントはhidekeyboard
およびshowkeyboard
と呼ばれます。 iOSでも起動するかどうかを確認できます。