モバイル キーボードでシフト キーが押されているかどうかを JavaScript で判断し、Caps Lock (シフト キーを 2 回押す) と区別する方法はありますか
2 に答える
いくつかの事実
まず、iOS キーボードに関するいくつかの事実を見てみましょう。すでにご存知だと思います。
- キーボードモードに入ると、
shift
キーは常にアクティブになります Caps Lock
手動でアクティブ化する必要があります(これはあまり広く使用されていないと思います)
iPhone シフトキーの扱い
この問題について少し調べてみたところ、次のことがわかりました。
キーは
shift
キーイベントをトリガーしませんiOSアプリを除いて、シフトキーが押されたかどうかを検出する特別なiPhoneブラウザAPIはありません(当然)
iOS によってトリガーされた
keydown
,keypress
,keyup
イベントは通常のように見えますが、shiftKey の使用を示しておらず、タイムスタンプとタイプを除いて区別できません。この問題のため、iOS でキーボード イベントを手動でディスパッチすることはできず
keyCode
、which
読み取り専用で常に に設定され0
ます。キーボード イベントを再トリガーして、シフト キーがまだオンになっていることを示すことはできません。実際、iPhone は
shift
キーをある種のキーのように扱いShort Term Caps Lock
ます。違いは、通常、一度アクティブ化すると、自動的に非アクティブ化されることです。
できること
ユーザーが Shift/Caps Lock を押すことに注意する必要があるかどうかを入力フィールドで示したいと思います (たとえば、パスワード フィールド)。私が思いついたのはある種の回避策ですが、何もないよりはましだと思います。
DOM セットアップ
<div id="wrapper">
<label for="test">ENTER SOMETHING HERE</label>
<input type="text" name="test" id="test"/>
</div>
<div id="warning"></div>
Javascript
caps lock
これは、ユーザーが大文字で入力したかどうかをチェックし、2 つの大文字の文字が入力された場合にユーザーが使用していると想定します。
var isCaps = false,
isUppercase = false,
str = '',
test = document.getElementById('test'),
warning = document.getElementById('warning');
function capsDetection(e) {
// Since where on iOS, we at least don't have to care
// about cross-browser stuff
var s = String.fromCharCode(e.which);
isCaps = isUppercase;
// if the char doesn't match its lower case friend, and the shift key is
// not pressed (which is always the case on iOS, but we leave it there
// for readability), we have uppercase input
isUppercase = (s.toUpperCase() === s && s.toLowerCase() !== s && !e.shiftKey);
// if its the second uppercase input in a row, we may have caps lock input
isCaps = isCaps && isUppercase;
// set the warning
if (isUppercase && !isCaps) {
str = 'You where using the shift key';
}
else if (isCaps) {
str = 'Caps lock seems to be activated';
} else {
str = '';
}
warning.innerHTML = str;
}
// the right event properties are only available on keypress
test.addEventListener('keypress', capsDetection);
私が言ったように、何もしないよりはましですが、ユーザーが何も入力せずにシフトキーが押されたことを知る必要がある場合の解決策ではありません。それは今のところ無理そうです。
これはJavascriptでは不可能だと思います。ただし、Objective Cでは可能です。