キーボードイベントは、ユーザーによるキーボードのアクションのことです。
例えば、特定のキーが押されたらメッセージを表示したり、あるいはどのキーが押されたか確認したい時などにキーボードイベントを活用します。
そこで今回は、キーボードイベントについて解説していきます。
keydownとkeyup
keydown
はキーが押された時に発生するイベントで、keyup
は押されていたキーが離された時に発生するイベントです。
これらのイベントにおけるバブリングの発生やデフォルト動作のキャンセルは、以下の通りです。
イベント | バブリング | キャンセル |
---|---|---|
keydown |
あり | 可 |
keyup |
あり | 可 |
keydown
イベントとkeyup
イベントが発生したら、それぞれのイベント名を出力するテストを行ってみます。
<p>Press a key</p>
<textarea id="area"></textarea>
<script>
let area = document.getElementById('area');
area.onkeydown = () => console.log('keydown');
are.onkeyup = () => console.log('keyup');
</script>
テキストフィールドの中で適当な文字を入力してみましょう。ここではa
を入力します。
すると、keydown
→ keyup
の順で出力されます。
このように、キーを押す作業とキーを離す作業によって文字の入力が行われることが分かります。
キー情報
キーボードイベントが発生しハンドラが実行されると、引数としてKeyboardEvent
オブジェクトが渡されます。
KeyboardEvent
オブジェクトは、イベント発生時に押されたキーの情報を持っています。
codeとkeyプロパティ
以下のプロパティにアクセスすると、キー情報を文字列で取得します。
code
:押されたキーを取得key
:押されたキーを表す文字を取得
code
プロパティは実際に押された物理的なキーコードを取得する一方、key
プロパティは押されたキーを表す文字を取得します。
例えば、a
が押されたパターンとShift + a
が押されたパターンでは、KeyboardEvent.key
では異なる文字を取得します。
<p>Press keys</p>
<textarea id="area"></textarea>
<script>
let area = document.getElementById('area');
area.onkeydown = (e) => {
console.log('key: ' + e.key);
};
</script>
a
を押した場合:
Shift + a
を押した場合:
一方、KeyboardEvent.code
はどちらのパターンも同じ結果です。
<p>Press keys</p>
<textarea id="area"></textarea>
<script>
let area = document.getElementById('area');
area.onkeydown = (e) => {
console.log('code: ' + e.code);
};
</script>
a
を押した場合:
Shift + a
を押した場合:
このように、KeyboardEvent.key
は文字であるため、Shift + a
を押すことで入力したキーが大文字のA
であると判断します。
KeyboardEvent.code
の場合、Shift
が押されているかどうかは関係なく、物理的に押されたキーコード、つまりKeyA
を取得します。
押されたキー | key | code |
---|---|---|
a |
a | KeyA |
Shift + a |
A | KeyA |
キーコード
KeyboardEvent.code
で取得したKeyA
のように、すべてのキーはキーコードを持っています。
キーボード上の位置やキーの種類に応じてコードが異なります。
キーの種類 | キーコード | 例 |
---|---|---|
文字キー | Key<letter> |
KeyA , KeyZ |
数字キー | Digit<number> |
Digit1 , Digit9 |
特殊キー | キーの名前 | ShiftLeft ,Tab |
Shift
キーのように、キーボードの左右に二箇所配置されているキーの場合、キーの名前に加えてLeft
またはRight
が示されます。
また、文字キーを表すキーコードは、key<letter>
ではなくKey<letter>
のように、最初の文字が大文字となるため注意が必要です。
押されたキーコードによって条件分岐を行いたい場合には、e.code == "Key<letter>"
となります。
文字以外のキー
キーが文字ではなく特殊キーの場合、KeyboardEvent.key
はどのような値を取得するでしょうか。
このような場合、key
プロパティとcode
プロパティは類似しています。
押されたキー | key | code |
---|---|---|
Tab |
Tab | Tab |
Enter |
Enter | Enter |
Shift |
Shift | ShiftLeft |
実際にTab, Enter, Shiftキーを押したパターンをブラウザで検証してみます。
<p>Press keys</p>
<textarea id="area"></textarea>
<script>
let area = document.getElementById('area');
area.onkeydown = (e) => {
console.log('key: ' + e.key);
console.log('code: ' + e.code);
};
</script>
上述の通り、key
プロパティは押されたキーを表す文字を取得します。つまり、キーの意味を表すため、特殊キーの名前を取得する場合がほとんどです。
しかし、code
プロパティは厳密なキーを取得します。
Shiftを押した場合、key
プロパティはキーの位置まで取得しない一方、code
プロパティは位置まで厳密に区別します。
修飾子キー
前回の記事、マウスイベントの座標とキーでも解説しましたが、イベント時にこれらのキーが押された場合true
が返ります。
altKey
:Altキーが押された場合ctrlKey
:Controlキーが押された場合shiftKey
:Shiftキーが押された場合metaKey
:Metaキーが押された場合
キーボードイベント時に、ShiftキーやControlキーが一緒に押されているか確認したい時にこれらのプロパティを使うと便利です。
例えば、テキストフィールドにShift + z
が押されたらメッセージを表示したいような場合です。
<p>Press Shift + z</p>
<textarea id="area"></textarea>
<p id="text"></p>
<script>
function showMessage(e) {
if (e.shiftKey && e.code == 'KeyZ') {
let text = document.getElementById('text');
text.innerHTML = 'You pressed <b>Shift + z!';
}
}
let area = document.getElementById('area');
area.addEventListener('keydown', showMessage);
</script>
テキストフィールドにShift + z
を押すと”You pressed Shift + z!”と表示されるのが確認できます。
まとめ
今回は、キーボードイベントについて解説しました。
// ポイント
* keydown:キーが押された時に発生するイベント
* keyup:押されていたキーが離された時に発生するイベント
* code:押されたキーを取得するプロパティ
* key:押されたキーを表す文字を取得するプロパティ
合わせて読みたいイベント詳細シリーズ
第1回:マウスイベント -ボタン操作
第2回:マウスイベント -カーソル移動
第3回:マウスイベント -座標とキー
第4回:キーボードイベント(当記事)
第5回:フォーカスイベント
第6回:データの更新
第7回:フォームの送信
第8回:ページのロードとアンロード
コメント