解説コードを読んでみよう
このサンプルでわかること
addEventListenerで「キーが押された」ことを受け取る方法- イベントオブジェクト
eから、押されたキーの情報を取り出す方法 e.key・e.code・e.keyCodeのちがい
使っているファイル
- index.phpデモのページ(HTML・CSS・JavaScript がすべてこの中)
1. 結果を表示する場所を用意する
押したキーを大きく表示する箱と、くわしい情報を並べる表を作ります。JavaScript から書き換えるので、それぞれに id をつけておきます。
<div class="kc">
<div class="kc__big" id="key">?</div>
<table class="kc__table">
<tr><th>e.key(押された文字)</th><td id="k-key">-</td></tr>
<tr><th>e.code(キーの位置)</th><td id="k-code">-</td></tr>
<tr><th>e.keyCode(キー番号・古い書き方)</th><td id="k-keycode">-</td></tr>
<tr><th>Shift</th><td id="k-shift">-</td></tr>
<tr><th>Ctrl</th><td id="k-ctrl">-</td></tr>
<tr><th>Alt</th><td id="k-alt">-</td></tr>
</table>
</div>
2. 表示する場所を探しておく
document.getElementById('id名') で HTML の要素を探し、変数に入れておきます。キーを押すたびに探し直さなくてすむので、処理が軽くなります。
(function() {
// 表示する場所を先に探しておく
var big = document.getElementById('key');
var keyEl = document.getElementById('k-key');
var codeEl = document.getElementById('k-code');
var numEl = document.getElementById('k-keycode');
var shiftEl = document.getElementById('k-shift');
var ctrlEl = document.getElementById('k-ctrl');
var altEl = document.getElementById('k-alt');
全体を (function() { ... })(); で囲んでいるのは、ここで作った変数が他のプログラムとぶつからないようにするためです(即時関数といいます)。
3. キーが押されたら情報を書き込む
document.addEventListener('keydown', keyDownFunc) は「ページのどこかでキーが押されたら keyDownFunc を呼んでください」という意味です。呼ばれるとき、押されたキーの情報が引数 e に入ってきます。
// キーが押されたときに呼ばれる関数
function keyDownFunc(e) {
big.textContent = e.key === ' ' ? 'Space' : e.key;
keyEl.textContent = e.key;
codeEl.textContent = e.code;
numEl.textContent = e.keyCode;
shiftEl.textContent = e.shiftKey; // true / false
ctrlEl.textContent = e.ctrlKey;
altEl.textContent = e.altKey;
}
// ページ全体で「キーが押された」を受け取る
document.addEventListener('keydown', keyDownFunc);
})();
| プロパティ | 中身 | Shift+A を押したとき |
|---|---|---|
e.key | 入力される文字 | A |
e.code | キーボード上のキーの位置(言語や Shift に関係なく同じ) | KeyA |
e.keyCode | キーの番号 | 65 |
e.shiftKey | Shift を押しているか | true |
e.ctrlKey / e.altKey | Ctrl / Alt を押しているか | false |
e.keyCode は古い書き方で、今は「非推奨」とされています。新しく作るときは e.key(文字で判定したいとき)か e.code(キーの位置で判定したいとき)を使いましょう。書き直す前のサンプルは keyCode と String.fromCharCode() を使っていましたが、記号キーなどで正しい文字にならないことがあったため、e.key を表示するように変えました。
日本語入力をオンにした状態でキーを押すと、e.key が Process になることがあります。入力モードを切り替えて、表示がどう変わるか確かめてみましょう。