
📋 Коды клавиш JavaScript: полная таблица event.key, event.code и event.which
Пользователь жмёт Escape, и модалка не закрывается. Нажимает Enter в поле поиска, и ничего. Знакомо? Обработка клавиатуры в JavaScript выглядит просто, пока не начинаешь разбираться в трёх событиях, десятке свойств и зоопарке браузерных отличий.
Каждый keydown или keyup порождает объект KeyboardEvent с двумя десятками полей. Часть из них, deprecated ещё с эпохи IE, часть, ведут себя по-разному в Firefox и Chrome. А документация MDN пестрит примечаниями «не используйте». Разработчику нужна не ещё одна спецификация, нужна шпаргалка, которая работает.
Ниже, полный справочник по клавиатурным событиям: от анатомии KeyboardEvent до готовых сниппетов для горячих клавиш. Таблицу кодов держите в закладках, пригодится в каждом втором проекте.
💡 Быстрый обзор:
- Используйте
keydownвместоkeypress: он работает для любых клавиш. event.keyдаёт символ клавиши,event.codeвозвращает её физический код.event.keyCodeиevent.whichустарели, в новом коде не применяйте.- В таблице ниже собраны коды всех стандартных клавиш для современных браузеров.
Что внутри KeyboardEvent
Когда пользователь нажимает любую клавишу, браузер создаёт объект KeyboardEvent, наследник UIEvent, который, в свою очередь, расширяет базовый Event. Внутри, свойства самой клавиши, состояние модификаторов, информация о раскладке.

Спецификация UI Events развивается: появляются новые свойства, старые уходят в deprecated. Главное изменение последних лет, отказ от числовых кодов (keyCode / charCode / which) в пользу event.key и event.code. Все современные браузеры поддерживают эту пару, и строить логику стоит именно на них.
Поддержка браузерами, практически полная: Chrome 51+, Firefox 29+, Safari 10.1+, Edge 79+. Если ваш проект не держится за IE11, можно забыть про event.which.
Три события: keydown, keypress и keyup
Браузер различает три клавиатурных события. Порядок срабатывания фиксирован:
- keydown, клавиша нажата (момент касания);
- keypress, клавиша удерживается и генерирует символ (только для символьных клавиш);
- keyup, клавиша отпущена.
Подписка на keydown через addEventListener:
1 const input = document.getElementById('type-here'); 2 3 input.addEventListener('keydown', function (event) { 4 console.log('Нажата:', event.key, '| Код:', event.code); 5 });
Для inline-обработчиков, атрибут элемента:
1 <input type="text" id="type-here" onkeyup="handleKey(event)">
Если вывести объект события в консоль, увидите полную структуру со всеми унаследованными полями от UIEvent и Event:

Почему keydown, основной выбор
keypress официально признан устаревшим. Он срабатывает только для клавиш, производящих символьное значение, и не ловит модификаторы: ни Alt, ни Ctrl, ни Shift, ни Meta. Ctrl+Z или Shift+Tab через keypress не обработать.
Разница между keydown и keyup: keydown срабатывает до обработки клавиши браузером; keyup срабатывает после. Отсюда важное следствие: event.preventDefault() внутри keydown отменяет действие браузера (например, ввод символа в поле), а внутри keyup нет. Для горячих клавиш, валидации ввода и игрового управления нужен именно keydown.
Таблица свойств KeyboardEvent
Свойство / Метод | Что возвращает | Статус |
|---|---|---|
| Символьное значение нажатой клавиши: | Актуально |
| Физический код клавиши на клавиатуре: | Актуально |
|
| Актуально |
|
| Актуально |
|
| Актуально |
|
| Актуально |
|
| Актуально |
| Числовой код клавиши (например | Устарело |
| Unicode-код символа | Устарело |
| Числовой код клавиши (аналог | Устарело |
Три нижние строки, deprecated. Везде, где возможно, переходите на event.key. Если приходится поддерживать старый браузер, делайте fallback:
1 window.addEventListener('keydown', function (event) { 2 const key = event.key !== undefined ? event.key : event.which; 3 if (key !== undefined) { 4 console.log('Клавиша:', key); 5 } 6 });
Но в 2026 году такой код, только для legacy-проектов. event.key работает везде.
Клавиши-модификаторы и комбинации
Клавиши Control, Shift, Alt и Meta сами по себе действий не производят, но меняют поведение других клавиш. Нажатие Z даёт букву «z», а Ctrl+Z выполняет отмену действия.
Отследить модификатор помогают булевы свойства события:
1 document.getElementById('editor').addEventListener('keydown', function (event) { 2 if (event.ctrlKey && event.key === 'z') { 3 event.preventDefault(); 4 undoAction(); 5 } 6 7 if (event.ctrlKey && event.shiftKey && event.key === 'z') { 8 event.preventDefault(); 9 redoAction(); 10 } 11 });
Тот же подход применим для любых комбинаций: Ctrl+S (сохранить), Ctrl+Shift+N (новое окно), Alt+Tab (переключение). Порядок проверки: сначала модификаторы через булевы флаги, затем event.key для конкретной клавиши. Так читается логика, а не тонет в числовых кодах.
Полная таблица кодов клавиш
Ниже, актуальная таблица для всех стандартных клавиш. Значения event.key и event.code даны так, как их возвращают современные браузеры (Chrome, Firefox, Edge, Safari).
Навигация и действия
Клавиша | event.which | event.key | event.code | Примечание |
|---|---|---|---|---|
Backspace | 8 | Backspace | Backspace |
|
Tab | 9 | Tab | Tab |
|
Enter | 13 | Enter | Enter |
|
Shift (левый) | 16 | Shift | ShiftLeft |
|
Shift (правый) | 16 | Shift | ShiftRight |
|
Ctrl (левый) | 17 | Control | ControlLeft |
|
Ctrl (правый) | 17 | Control | ControlRight |
|
Alt (левый) | 18 | Alt | AltLeft |
|
Alt (правый) | 18 | Alt | AltRight |
|
Pause / Break | 19 | Pause | Pause |
|
Caps Lock | 20 | CapsLock | CapsLock |
|
Escape | 27 | Escape | Escape |
|
Space | 32 |
| Space |
|
Page Up | 33 | PageUp | PageUp |
|
Page Down | 34 | PageDown | PageDown |
|
End | 35 | End | End |
|
Home | 36 | Home | Home |
|
Arrow Left | 37 | ArrowLeft | ArrowLeft |
|
Arrow Up | 38 | ArrowUp | ArrowUp |
|
Arrow Right | 39 | ArrowRight | ArrowRight |
|
Arrow Down | 40 | ArrowDown | ArrowDown |
|
Print Screen | 44 | PrintScreen | PrintScreen |
|
Insert | 45 | Insert | Insert |
|
Delete | 46 | Delete | Delete |
|
Цифровой ряд (основная клавиатура)
Клавиша | event.which | event.key | event.code |
|---|---|---|---|
0 | 48 | 0 | Digit0 |
1 | 49 | 1 | Digit1 |
2 | 50 | 2 | Digit2 |
3 | 51 | 3 | Digit3 |
4 | 52 | 4 | Digit4 |
5 | 53 | 5 | Digit5 |
6 | 54 | 6 | Digit6 |
7 | 55 | 7 | Digit7 |
8 | 56 | 8 | Digit8 |
9 | 57 | 9 | Digit9 |
Буквы A-Z
Клавиша | event.which | event.key | event.code |
|---|---|---|---|
A | 65 | a | KeyA |
B | 66 | b | KeyB |
C | 67 | c | KeyC |
D | 68 | d | KeyD |
E | 69 | e | KeyE |
F | 70 | f | KeyF |
G | 71 | g | KeyG |
H | 72 | h | KeyH |
I | 73 | i | KeyI |
J | 74 | j | KeyJ |
K | 75 | k | KeyK |
L | 76 | l | KeyL |
M | 77 | m | KeyM |
N | 78 | n | KeyN |
O | 79 | o | KeyO |
P | 80 | p | KeyP |
Q | 81 | q | KeyQ |
R | 82 | r | KeyR |
S | 83 | s | KeyS |
T | 84 | t | KeyT |
U | 85 | u | KeyU |
V | 86 | v | KeyV |
W | 87 | w | KeyW |
X | 88 | x | KeyX |
Y | 89 | y | KeyY |
Z | 90 | z | KeyZ |
event.key возвращает значение в нижнем регистре для букв. event.code не зависит от регистра и раскладки: KeyA означает физическую клавишу A, даже если раскладка русская и вводится «Ф».
Специальные клавиши
Клавиша | event.which | event.key | event.code | Примечание |
|---|---|---|---|---|
Левая Windows | 91 | Meta | MetaLeft |
|
Правая Windows | 92 | Meta | MetaRight |
|
Контекстное меню | 93 | ContextMenu | ContextMenu |
|
Цифровая клавиатура (Numpad)
Клавиша | event.which | event.key | event.code |
|---|---|---|---|
Numpad 0 | 96 | 0 | Numpad0 |
Numpad 1 | 97 | 1 | Numpad1 |
Numpad 2 | 98 | 2 | Numpad2 |
Numpad 3 | 99 | 3 | Numpad3 |
Numpad 4 | 100 | 4 | Numpad4 |
Numpad 5 | 101 | 5 | Numpad5 |
Numpad 6 | 102 | 6 | Numpad6 |
Numpad 7 | 103 | 7 | Numpad7 |
Numpad 8 | 104 | 8 | Numpad8 |
Numpad 9 | 105 | 9 | Numpad9 |
Numpad Multiply | 106 | * | NumpadMultiply |
Numpad Add | 107 | + | NumpadAdd |
Numpad Subtract | 109 | - | NumpadSubtract |
Numpad Decimal | 110 | . | NumpadDecimal |
Numpad Divide | 111 | / | NumpadDivide |
Функциональные клавиши
Клавиша | event.which | event.key | event.code |
|---|---|---|---|
F1 | 112 | F1 | F1 |
F2 | 113 | F2 | F2 |
F3 | 114 | F3 | F3 |
F4 | 115 | F4 | F4 |
F5 | 116 | F5 | F5 |
F6 | 117 | F6 | F6 |
F7 | 118 | F7 | F7 |
F8 | 119 | F8 | F8 |
F9 | 120 | F9 | F9 |
F10 | 121 | F10 | F10 |
F11 | 122 | F11 | F11 |
F12 | 123 | F12 | F12 |
Системные и мультимедийные
Клавиша | event.which | event.key | event.code | Примечание |
|---|---|---|---|---|
Num Lock | 144 | NumLock | NumLock |
|
Scroll Lock | 145 | ScrollLock | ScrollLock |
|
Mute | 173 | AudioVolumeMute | AudioVolumeMute | В Firefox |
Volume Down | 174 | AudioVolumeDown | AudioVolumeDown | В Firefox |
Volume Up | 175 | AudioVolumeUp | AudioVolumeUp | В Firefox |
Media Player | 181 | LaunchMediaPlayer | LaunchMediaPlayer | В Firefox |
Launch App 1 | 182 | LaunchApplication1 | LaunchApplication1 | В Firefox |
Launch App 2 | 183 | LaunchApplication2 | LaunchApplication2 | В Firefox |
Знаки пунктуации и символы
Клавиша | event.which | event.key | event.code | Примечание |
|---|---|---|---|---|
Semicolon (;) | 186 | ; | Semicolon | В Firefox |
Equal (=) | 187 | = | Equal | В Firefox |
Comma ( | 188 |
| Comma |
|
Minus (-) | 189 | - | Minus | В Firefox |
Period (.) | 190 | . | Period |
|
Slash (/) | 191 | / | Slash |
|
Backquote ( | Backquote |
|
|
|
Bracket Left ([) | 219 | [ | BracketLeft |
|
Backslash () | 220 | \ | Backslash |
|
Bracket Right (]) | 221 | ] | BracketRight |
|
Quote (') | 222 | ' | Quote |
|
Важные замечания к таблице
event.which, устаревшее свойство, используйтеevent.key.event.codeодинаков для строчной (a) и заглавной (A) буквы, это физическая клавиша.event.keyвозвращает фактический символ с учётом регистра.- В Firefox значения
event.whichдля клавишEqual,SemicolonиMinusотличаются от Chrome/Edge/Safari (указаны в примечаниях). Ещё одна причина не использоватьevent.which. - Браузеры на основе Chromium и Firefox дают одинаковые
event.keyиevent.codeдля всех перечисленных клавиш. - Виртуальные клавиатуры: спецификация UI Events требует, чтобы виртуальная клавиатура (мобильная, экранная), повторяющая раскладку стандартной, возвращала корректные
event.code. На практике мобильные браузеры (Chrome Android, Safari iOS) корректно обрабатываютkeydown/keyupдля основных клавиш, ноevent.codeможет быть пустым для нестандартных раскладок.
Интерактивный тренажёр

Для быстрой проверки любого кода из статьи используйте клавиатурный тренажёр: keyevents.netlify.app. Наводите курсор на область, нажимайте клавиши, и смотрите значения event.key, event.code и event.which, а также состояние флагов модификаторов в реальном времени. Исходный код доступен на GitHub.
Видео: клавиатурные события на практике
Короткий практический разбор keydown и keyup, работы модификаторов и горячих клавиш с живыми примерами:
⁉️🤔 Частые вопросы
Чем event.key отличается от event.code?
event.keyвозвращает символьное значение с учётом раскладки и регистра: для клавиши A это"a"(или"A"с Shift), для русской раскладки,"ф".event.codeвозвращает физический код клавиши, одинаковый для всех раскладок:"KeyA". Для горячих клавиш надёжнееevent.code, он не зависит от языка ввода. Для текстового ввода используйтеevent.key.
Почему keypress больше не используют?
Спецификация W3C пометила
keypressкак устаревший: он срабатывает только для символьных клавиш и не ловит модификаторы.Ctrl+C,Shift+Tabи другие комбинации черезkeypressне обработать.keydownпокрывает все клавиши и поддерживается одинаково во всех современных браузерах.
Можно ли полностью отказаться от event.which и event.keyCode?
Да, в 2026 году можно.
event.keyподдерживается Chrome 51+, Firefox 29+, Safari 10.1+, Edge 79+. Если ваш проект не нацелен на IE11 или Firefox 28, используйте толькоevent.keyиevent.code.
Как обработать долгое нажатие клавиши?
Сочетайте
keydownиkeyup. Приkeydownзапускайте таймер илиrequestAnimationFrame, приkeyup, сбрасывайте. Для игрового ввода это стандартный паттерн: клавиша зажата, персонаж движется, отпущена, останавливается.
Клавиатурные события работают на мобильных устройствах?
keydownиkeyupработают в мобильных браузерах при использовании внешней Bluetooth-клавиатуры. Экранная клавиатура генерирует событияinput, а неkeydown/keyupдля всех клавиш, поэтому для текстовых полей на мобильных лучше использовать событиеinput.
Как отличить левый Shift от правого?
Через
event.code:"ShiftLeft"или"ShiftRight".event.keyдля обоих возвращает"Shift". Аналогично дляControl,AltиMeta.
Что использовать в вашем проекте
Если пишете новый код, берите keydown как основное событие, а для идентификации клавиш, event.key (символ) и event.code (физическая клавиша). Связка покрывает все сценарии: горячие клавиши, навигацию, игровой ввод, валидацию форм.
Поддерживаете продукт с legacy-кодом на event.which или event.keyCode, запланируйте рефакторинг. Объём работы небольшой: замена в обработчиках, а профит, чистый, предсказуемый код без зоопарка браузерных отличий.
Держите таблицу выше в закладках. Когда в следующий раз понадобится код конкретной клавиши, открывайте и копируйте нужное значение event.code, не вспоминая числовые коды из эпохи IE6.



