--- title: KeyboardEvent.key slug: Web/API/KeyboardEvent/key tags: - API - DOM - KeyboardEvent - Property - Read-only - Reference - UI Events - プロパティ translation_of: Web/API/KeyboardEvent/key ---
{{domxref("KeyboardEvent")}} インターフェイスの key
はプロパティは読み取り専用で、ユーザーが押したキーの値を、 Shift キーなどの修飾キーやキーボードのロケールやレイアウトを考慮した値で返します。値は以下のように判断されます。
キーの値の完全なリストを参照してください。
KeyboardEvent
がデッドキーが押されたことを表すのであれば、キーの値は "Dead
" になります。WM_APPCOMMAND
イベントを起動します。これらのイベントは DOM キーボードイベントに対応付けられ、 Windows の「仮想キーコード」の中で、実際のキーコードではないものの紹介されます。Unidentified
の値を返します。それぞれの KeyboardEvent
はあらかじめ定められたシーケンスで発生します。キーが押された場合、発生する一連の KeyboardEvent
は {{domxref("Event.preventDefault")}} が呼び出されないと想定すれば次のようになります。
true
に設定されます。true
の要素に文字を挿入する場合は、 {{domxref("HTMLElement/beforeinput_event", "beforeinput")}}と{{domxref("HTMLElement/input_event", "input")}}イベント型がその順番で発火されます。 他の実装が{{domxref("Element/keypress_event", "keypress")}}イベントを実装していれば発火する可能性があることに注意してください。イベントはキーが押されている間連続で発火します。1と3の処理で、 KeyboardEvent.key
属性が定義され、先ほど定義したルールにのっとって値が設定されます。
Consider the event sequence generated when we interact with the Shift and the 2 key using a U.S keyboard layout as compared to when we do so using a UK keyboard layout.
Try experimenting using the following two test cases:
<div class="fx"> <div> <textarea rows="5" name="test-target" id="test-target"></textarea> <button type="button" name="btn-clear-console" id="btn-clear-console">clear console</button> </div> <div class="flex"> <pre id="console-log"></pre> </div> </div>
.fx { -webkit-display: flex; display: flex; margin-left: -20px; margin-right: -20px; } .fx > div { padding-left: 20px; padding-right: 20px; } .fx > div:first-child { width: 30%; } .flex { -webkit-flex: 1; flex: 1; } #test-target { display: block; width: 100%; margin-bottom: 10px; }
let textarea = document.getElementById('test-target'), consoleLog = document.getElementById('console-log'), btnClearConsole = document.getElementById('btn-clear-console'); function logMessage(message) { document.getElementById("console-log").innerHTML += message + "<br>"; } textarea.addEventListener('keydown', (e) => { if (!e.repeat) logMessage(`Key "${e.key}" pressed [event: keydown]`); else logMessage(`Key "${e.key}" repeating [event: keydown]`); }); textarea.addEventListener('beforeinput', (e) => { logMessage(`Key "${e.data}" about to be input [event: beforeinput]`); }); textarea.addEventListener('input', (e) => { logMessage(`Key "${e.data}" input [event: input]`); }); textarea.addEventListener('keyup', (e) => { logMessage(`Key "${e.key}" released [event: keyup]`); }); btnClearConsole.addEventListener('click', (e) => { let child = consoleLog.firstChild; while (child) { consoleLog.removeChild(child); child = consoleLog.firstChild; } });
{{EmbedLiveSample('KeyboardEvent_sequence_example')}}
注: On browsers that don't fully implement the {{domxref("InputEvent")}} interface which is used for the {{domxref("HTMLElement/beforeinput_event", "beforeinput")}} and {{domxref("HTMLElement/input_event", "input")}} events, you may get incorrect output on those lines of the log output.
When the shift key is pressed, a {{domxref("Element/keydown_event", "keydown")}} event is first fired, and the key
property value is set to the string Shift
. As we keep holding this key, the {{domxref("Element/keydown_event", "keydown")}} event does not continue to fire repeatedly because it does not produce a character key.
When key 2
is pressed, another {{domxref("Element/keydown_event", "keydown")}} event is fired for this new key press, and the key
property value for the event is set to the string @
for the U.S keyboard type and "
for the UK keyboard type, because of the active modifier shift
key. The {{domxref("HTMLElement/beforeinput_event", "beforeinput")}} and {{domxref("HTMLElement/input_event", "input")}} events are fired next because a character key has been produced.
As we release the key 2
, a {{domxref("Element/keyup_event", "keyup")}} event is fired and the key
property will maintain the string values @
and "
for the different keyboard layouts respectively.
As we finally release the shift
key, another {{domxref("Element/keyup_event", "keyup")}} event is fired for it, and the key attribute value remains Shift
.
When the shift key is pressed, a {{domxref("Element/keydown_event", "keydown")}} event is first fired, and the key
property value is set to be the string Shift
. As we keep holding this key, the keydown event does not continue to fire repeatedly because it produced no character key.
When key 2
is pressed, another {{domxref("Element/keydown_event", "keydown")}} event is fired for this new key press, and the key
property value for the event is set to be the string @
for the U.S keyboard type and "
for the UK keyboard type, because of the active modifier shift
key. The {{domxref("HTMLElement/beforeinput_event", "beforeinput")}} and {{domxref("HTMLElement/input_event", "input")}}{{domxref("HTMLElement/beforeinput_event", "beforeinput")}} and {{domxref("HTMLElement/input_event", "input")}} events are fired next because a character key has been produced. As we keep holding the key, the {{domxref("Element/keydown_event", "keydown")}} event continues to fire repeatedly and the {{domxref("KeyboardEvent.repeat")}} property is set to true
. The {{domxref("HTMLElement/beforeinput_event", "beforeinput")}} and {{domxref("HTMLElement/input_event", "input")}} events are fired repeatedly as well.
As we release the shift
key, a {{domxref("Element/keyup_event", "keyup")}} event is fired for it, and the key attribute value remains Shift
. At this point, notice that the key
property value for the repeating keydown event of the key 2
key press is now "2" because the modifier shift
key is no longer active. The same goes for the {{domxref("InputEvent.data")}} property of the {{domxref("HTMLElement/beforeinput_event", "beforeinput")}} and {{domxref("HTMLElement/input_event", "input")}} events.
As we finally release the key 2
, a {{domxref("Element/keyup_event", "keyup")}} event is fired but the key
property will be set to the string value 2
for both keyboard layouts because the modifier shift
key is no longer active.
This example uses {{domxref("EventTarget.addEventListener()")}} to listen for {{domxref("Element/keydown_event", "keydown")}} events. When they occur, the key's value is checked to see if it's one of the keys the code is interested in, and if it is, it gets processed in some way (possibly by steering a spacecraft, perhaps by changing the selected cell in a spreadsheet).
window.addEventListener("keydown", function (event) { if (event.defaultPrevented) { return; // Do nothing if the event was already processed } switch (event.key) { case "Down": // IE/Edge specific value case "ArrowDown": // Do something for "down arrow" key press. break; case "Up": // IE/Edge specific value case "ArrowUp": // Do something for "up arrow" key press. break; case "Left": // IE/Edge specific value case "ArrowLeft": // Do something for "left arrow" key press. break; case "Right": // IE/Edge specific value case "ArrowRight": // Do something for "right arrow" key press. break; case "Enter": // Do something for "enter" or "return" key press. break; case "Esc": // IE/Edge specific value case "Escape": // Do something for "esc" key press. break; default: return; // Quit when this doesn't handle the key event. } // Cancel the default action to avoid it being handled twice event.preventDefault(); }, true);
仕様書 | 状態 | 備考 |
---|---|---|
{{SpecName('UI Events', '#dom-keyboardevent-key', 'KeyboardEvent.key')}} | {{Spec2('UI Events')}} | |
{{SpecName('DOM3 Events', '#widl-KeyboardEvent-key', 'KeyboardEvent.key')}} | {{Spec2('DOM3 Events')}} | 初回定義で、キーの値を含みます。 |
{{Compat("api.KeyboardEvent.key")}}