KeyboardEvent: свойство key
Базовая Широко поддерживается
Эта функция хорошо отработана и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с июля 2015 года.
Свойство key только для чтения интерфейса KeyboardEvent возвращает значение нажатой пользователем клавиши, учитывая состояние клавиш-модификаторов, таких как Shift, а также локаль и раскладку клавиатуры.
Значение
Строка.
Его значение определяется следующим образом:
- Если нажатая клавиша имеет печатное представление, возвращаемое значение — это непустая строка Unicode, содержащая печатное представление клавиши. Например: если нажата клавиша Space, возвращаемое значение — один пробел (
" "). Если нажата клавиша B, возвращаемое значение — строка"b". Однако, если одновременно нажата клавиша Shift (так чтоshiftKeyравноtrue), возвращаемое значение — строка"B". - Если нажатая клавиша — управляющий или специальный символ, возвращаемое значение — одно из предопределённых значений клавиш из списка.
- Если
KeyboardEventпредставляет нажатие мертвой клавиши, значение клавиши должно быть"Dead". - Некоторые специальные клавиши клавиатуры (например, расширенные клавиши для управления медиа на мультимедийных клавиатурах) не генерируют коды клавиш в Windows; вместо этого они вызывают события
WM_APPCOMMAND. Эти события отображаются в события клавиатуры DOM и перечислены среди «виртуальных кодов клавиш» для Windows, даже если они фактически не являются кодами клавиш. - Если клавишу невозможно идентифицировать, возвращаемое значение —
Unidentified.
Последовательность событий KeyboardEvent
Каждое KeyboardEvent срабатывает в предопределённой последовательности. Для нажатия клавиши последовательность срабатывания KeyboardEvent выглядит следующим образом, при условии, что не вызывается Event.preventDefault:
- Сначала срабатывает событие
keydown. Если клавиша удерживается, и она генерирует символьную клавишу, то событие продолжает генерироваться с интервалом, зависящим от реализации платформы, и свойствоKeyboardEvent.repeatустанавливается вtrue. - Если клавиша генерирует символьную клавишу, которая должна вставлять символ в, возможно,
<input>,<textarea>или элемент сHTMLElement.contentEditable, установленным в true, срабатывают события типовbeforeinputиinputв указанном порядке. Обратите внимание, что в некоторых других реализациях может срабатывать событиеkeypress, если оно поддерживается. События будут срабатывать повторно, пока клавиша удерживается. - После того, как клавиша отпущена, срабатывает событие
keyup. Это завершает процесс.
В последовательности 1 и 3 атрибут KeyboardEvent.key определён и установлен соответствующим значением в соответствии с ранее определёнными правилами.
Пример последовательности KeyboardEvent
Рассмотрим последовательность событий, генерируемых при взаимодействии с клавишей Shift и 2 с использованием раскладки клавиатуры США по сравнению с раскладкой клавиатуры Великобритании.
Попробуйте провести эксперимент, используя следующие два тестовых случая:
- Нажмите и удерживайте клавишу Shift, затем нажмите 2 и отпустите её. Затем отпустите клавишу Shift.
- Нажмите и удерживайте клавишу Shift, затем нажмите и удерживайте 2. Отпустите клавишу Shift. Наконец, отпустите 2.
HTML
<div class="fx">
<div>
<textarea rows="5" name="test-target" id="test-target"></textarea>
<button type="button" name="btn-reset" id="btn-reset">Reset</button>
</div>
<div class="flex">
<pre id="console-log"></pre>
</div>
</div>
CSS
.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;
}
JavaScript
const textarea = document.getElementById("test-target");
const consoleLog = document.getElementById("console-log");
const btnReset = document.getElementById("btn-reset");
function logMessage(message) {
consoleLog.innerText += `${message}\n`;
}
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]`);
});
btnReset.addEventListener("click", (e) => {
let child = consoleLog.firstChild;
while (child) {
consoleLog.removeChild(child);
child = consoleLog.firstChild;
}
textarea.value = "";
});
Результат
Примечание: В браузерах, которые не полностью реализуют интерфейс InputEvent, используемый для событий beforeinput и input, вы можете получить неверный вывод в этих строках лога.
Случай 1
Когда нажата клавиша shift, сначала срабатывает событие keydown, и значение свойства key устанавливается в строку Shift. При дальнейшем удерживании этой клавиши событие keydown не срабатывает повторно, потому что оно не генерирует символьную клавишу.
Когда нажимается key 2, срабатывает ещё одно событие keydown для этого нового нажатия клавиши, и значение свойства key для события устанавливается в строку @ для раскладки клавиатуры США и " для раскладки клавиатуры Великобритании, из-за активной клавиши-модификатора shift. Далее срабатывают события beforeinput и input, поскольку была сгенерирована символьная клавиша.
Когда мы отпускаем key 2, срабатывает событие keyup, и свойство key сохраняет строковые значения @ и " соответственно для различных раскладок клавиатуры.
Когда мы наконец отпускаем клавишу shift, для неё срабатывает ещё одно событие keyup, и значение атрибута клавиши остаётся Shift.
Случай 2
При нажатии клавиши shift сначала срабатывает событие keydown, и значение свойства key устанавливается в строку Shift. При дальнейшем удерживании этой клавиши событие keydown не срабатывает повторно, так как оно не генерирует символьную клавишу.
При нажатии key 2, срабатывает ещё одно событие keydown для этого нового нажатия клавиши, и значение свойства key для события устанавливается в строку @ для раскладки клавиатуры США и " для раскладки клавиатуры Великобритании из-за активной клавиши-модификатора shift. Далее срабатывают события beforeinput и input, поскольку была сгенерирована символьная клавиша. При удерживании клавиши событие keydown срабатывает повторно, а свойство KeyboardEvent.repeat устанавливается в true. События beforeinput и input также срабатывают повторно.
При отпускании клавиши shift, срабатывает событие keyup, и значение атрибута клавиши остаётся Shift. В этот момент обратите внимание, что значение свойства key для повторяющегося события keydown нажатия клавиши key 2 теперь равно "2", поскольку клавиша-модификатор shift больше не активна. То же самое касается свойства InputEvent.data событий beforeinput и input.
При окончательном отпускании клавиши key 2, срабатывает событие keyup, но свойство key будет установлено в строковое значение 2 для обеих раскладок клавиатуры, поскольку клавиша-модификатор shift больше не активна.
Примеры
В этом примере используется EventTarget.addEventListener() для прослушивания событий keydown. При их возникновении значение клавиши проверяется на соответствие интересующим кодам, и если да, то оно обрабатывается каким-то образом (возможно, управлением космическим кораблём или изменением выделенной ячейки в таблице).
window.addEventListener(
"keydown",
(event) => {
if (event.defaultPrevented) {
return; // Do nothing if the event was already processed
}
switch (event.key) {
case "ArrowDown":
// Do something for "down arrow" key press.
break;
case "ArrowUp":
// Do something for "up arrow" key press.
break;
case "ArrowLeft":
// Do something for "left arrow" key press.
break;
case "ArrowRight":
// Do something for "right arrow" key press.
break;
case "Enter":
// Do something for "enter" or "return" key press.
break;
case " ":
// Do something for "space" key press.
break;
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,
);
Спецификации
Совместимость браузеров
| Рабочий стол | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на IOS | Samsung Internet | WebView Android | |
key |
51 | 12 | 23 | 38 | 10.1 | 51 | 23 | 41 | 10.3 | 5.0 | 51 |
dead_key |
51 | ≤79 | 37 | 38 | 10.1 | 51 | 37 | 41 | 10.3 | 5.0 | 51 |
non_printable_keys |
51 | 12 | 23 | 38 | 10.1 | 51 | 23 | 41 | 10.3 | 5.0 | 51 |
printable_key |
51 | 12 | 29 | 38 | 10.1 | 51 | 29 | 41 | 10.3 | 5.0 | 51 |
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key