
📋 Kody klawiszy JavaScript: pełna tabela event.key, event.code i event.which
Użytkownik naciska Escape, a modal się nie zamyka. Naciska Enter w polu wyszukiwania i nic. Znajome? Obsługa klawiatury w JavaScript wydaje się prosta, dopóki nie zacznie się Pan/Pani zagłębiać w trzy zdarzenia, dziesięć właściwości i zoo różnic między przeglądarkami.
Każdy keydown lub keyup generuje obiekt KeyboardEvent z dwoma tuzinami pól. Część z nich jest przestarzała od czasów IE, część zachowuje się inaczej w Firefox i Chrome. A dokumentacja MDN roi się od uwag „nie używać". Deweloper nie potrzebuje kolejnej specyfikacji, lecz ściągawki, która działa.
Poniżej pełny przewodnik po zdarzeniach klawiaturowych: od anatomii KeyboardEvent po gotowe snippety dla skrótów klawiszowych. Tabelę kodów proszę trzymać w zakładkach, przyda się w co drugim projekcie.
💡 Szybki przegląd:
- Proszę używać
keydownzamiastkeypress: działa dla dowolnych klawiszy. event.keypodaje znak klawisza,event.codezwraca jego fizyczny kod.event.keyCodeorazevent.whichsą przestarzałe, w nowym kodzie proszę ich nie stosować.- W tabeli poniżej zebrano kody wszystkich standardowych klawiszy dla współczesnych przeglądarek.
Co znajduje się wewnątrz KeyboardEvent
Gdy użytkownik naciska dowolny klawisz, przeglądarka tworzy obiekt KeyboardEvent, potomka UIEvent, który z kolei rozszerza bazowy Event. Wewnątrz znajdują się właściwości samego klawisza, stan modyfikatorów, informacja o układzie klawiatury.

Specyfikacja UI Events ewoluuje: pojawiają się nowe właściwości, starsze przechodzą do statusu deprecated. Główna zmiana ostatnich lat to odejście od kodów numerycznych (keyCode / charCode / which) na rzecz event.key oraz event.code. Wszystkie współczesne przeglądarki wspierają tę parę i to na nich należy opierać logikę.
Wsparcie przeglądarek jest praktycznie pełne: Chrome 51+, Firefox 29+, Safari 10.1+, Edge 79+. Jeśli Pana/Pani projekt nie trzyma się IE11, można zapomnieć o event.which.
Trzy zdarzenia: keydown, keypress i keyup
Przeglądarka rozróżnia trzy zdarzenia klawiaturowe. Kolejność wyzwalania jest stała:
- keydown, klawisz został naciśnięty (moment dotknięcia);
- keypress, klawisz jest przytrzymywany i generuje znak (tylko dla klawiszy znakowych);
- keyup, klawisz został zwolniony.
Subskrypcja keydown przez addEventListener:
1 const input = document.getElementById('type-here'); 2 3 input.addEventListener('keydown', function (event) { 4 console.log('Нажата:', event.key, '| Код:', event.code); 5 });
Dla obsługi inline, atrybut elementu:
1 <input type="text" id="type-here" onkeyup="handleKey(event)">
Jeśli wyświetli Pan/Pani obiekt zdarzenia w konsoli, zobaczy Pan/Pani pełną strukturę ze wszystkimi odziedziczonymi polami z UIEvent i Event:

Dlaczego keydown jest głównym wyborem
keypress został oficjalnie uznany za przestarzały. Wyzwala się tylko dla klawiszy, które generują wartość znakową, i nie przechwytuje modyfikatorów: ani Alt, ani Ctrl, ani Shift, ani Meta. Ctrl+Z lub Shift+Tab przez keypress nie da się obsłużyć.
Różnica między keydown a keyup: keydown wyzwala się przed przetworzeniem klawisza przez przeglądarkę; keyup wyzwala się po. Stąd ważna konsekwencja: event.preventDefault() wewnątrz keydown anuluje działanie przeglądarki (na przykład wprowadzenie znaku w pole), a wewnątrz keyup już nie. Dla skrótów klawiszowych, walidacji wprowadzania i sterowania w grach potrzebny jest właśnie keydown.
Tabela właściwości KeyboardEvent
Właściwość / Metoda | Co zwraca | Status |
|---|---|---|
| Wartość znakowa naciśniętego klawisza: | Aktualne |
| Fizyczny kod klawisza na klawiaturze: | Aktualne |
|
| Aktualne |
|
| Aktualne |
|
| Aktualne |
|
| Aktualne |
|
| Aktualne |
| Numeryczny kod klawisza (np. | Przestarzałe |
| Kod Unicode znaku | Przestarzałe |
| Numeryczny kod klawisza (analogiczny do | Przestarzałe |
Trzy dolne wiersze są deprecated. Wszędzie, gdzie to możliwe, proszę przechodzić na event.key. Jeśli musi Pan/Pani wspierać starą przeglądarkę, proszę zrobić 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 });
Ale w 2026 roku taki kod jest tylko dla projektów legacy. event.key działa wszędzie.
Klawisze modyfikujące i kombinacje
Klawisze Control, Shift, Alt i Meta same w sobie nie wykonują akcji, ale zmieniają zachowanie innych klawiszy. Naciśnięcie Z daje literę „z", a Ctrl+Z wykonuje cofnięcie akcji.
Śledzenie modyfikatora umożliwiają właściwości logiczne zdarzenia:
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 });
To samo podejście stosuje się dla dowolnych kombinacji: Ctrl+S (zapisz), Ctrl+Shift+N (nowe okno), Alt+Tab (przełączanie). Kolejność sprawdzania: najpierw modyfikatory przez flagi logiczne, potem event.key dla konkretnego klawisza. Dzięki temu logika jest czytelna, a nie tonie w kodach numerycznych.
Pełna tabela kodów klawiszy
Poniżej aktualna tabela dla wszystkich standardowych klawiszy. Wartości event.key oraz event.code podano tak, jak zwracają je współczesne przeglądarki (Chrome, Firefox, Edge, Safari).
Nawigacja i akcje
Klawisz | event.which | event.key | event.code | Uwaga |
|---|---|---|---|---|
Backspace | 8 | Backspace | Backspace |
|
Tab | 9 | Tab | Tab |
|
Enter | 13 | Enter | Enter |
|
Shift (lewy) | 16 | Shift | ShiftLeft |
|
Shift (prawy) | 16 | Shift | ShiftRight |
|
Ctrl (lewy) | 17 | Control | ControlLeft |
|
Ctrl (prawy) | 17 | Control | ControlRight |
|
Alt (lewy) | 18 | Alt | AltLeft |
|
Alt (prawy) | 18 | Alt | AltRight |
|
Pause / Break | 19 | Pause | Pause |
|
Caps Lock | 20 | CapsLock | CapsLock |
|
Escape | 27 | Escape | Escape |
|
Spacja | 32 |
| Space |
|
Page Up | 33 | PageUp | PageUp |
|
Page Down | 34 | PageDown | PageDown |
|
End | 35 | End | End |
|
Home | 36 | Home | Home |
|
Strzałka w lewo | 37 | ArrowLeft | ArrowLeft |
|
Strzałka w górę | 38 | ArrowUp | ArrowUp |
|
Strzałka w prawo | 39 | ArrowRight | ArrowRight |
|
Strzałka w dół | 40 | ArrowDown | ArrowDown |
|
Print Screen | 44 | PrintScreen | PrintScreen |
|
Insert | 45 | Insert | Insert |
|
Delete | 46 | Delete | Delete |
|
Rząd cyfr (główna klawiatura)
Klawisz | 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 |
Litery A-Z
Klawisz | 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 zwraca wartość małymi literami dla liter. event.code nie zależy od wielkości liter ani układu klawiatury: KeyA oznacza fizyczny klawisz A, nawet jeśli układ jest polski i wprowadzane jest „A".
Klawisze specjalne
Klawisz | event.which | event.key | event.code | Uwaga |
|---|---|---|---|---|
Lewy Windows | 91 | Meta | MetaLeft |
|
Prawy Windows | 92 | Meta | MetaRight |
|
Menu kontekstowe | 93 | ContextMenu | ContextMenu |
|
Klawiatura numeryczna (Numpad)
Klawisz | 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 |
Klawisze funkcyjne
Klawisz | 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 |
Systemowe i multimedialne
Klawisz | event.which | event.key | event.code | Uwaga |
|---|---|---|---|---|
Num Lock | 144 | NumLock | NumLock |
|
Scroll Lock | 145 | ScrollLock | ScrollLock |
|
Wyciszenie | 173 | AudioVolumeMute | AudioVolumeMute | W Firefox |
Ściszanie | 174 | AudioVolumeDown | AudioVolumeDown | W Firefox |
Pogłaśnianie | 175 | AudioVolumeUp | AudioVolumeUp | W Firefox |
Odtwarzacz multimedialny | 181 | LaunchMediaPlayer | LaunchMediaPlayer | W Firefox |
Uruchom aplikację 1 | 182 | LaunchApplication1 | LaunchApplication1 | W Firefox |
Uruchom aplikację 2 | 183 | LaunchApplication2 | LaunchApplication2 | W Firefox |
Znaki interpunkcyjne i symbole
Klawisz | event.which | event.key | event.code | Uwaga |
|---|---|---|---|---|
Średnik (;) | 186 | ; | Semicolon | W Firefox |
Równa się (=) | 187 | = | Equal | W Firefox |
Przecinek ( | 188 |
| Comma |
|
Minus (-) | 189 | - | Minus | W Firefox |
Kropka (.) | 190 | . | Period |
|
Ukośnik (/) | 191 | / | Slash |
|
Apostrof odwrócony ( | Backquote |
|
|
|
Nawias kwadratowy lewy ([) | 219 | [ | BracketLeft |
|
Ukośnik wsteczny () | 220 | \ | Backslash |
|
Nawias kwadratowy prawy (]) | 221 | ] | BracketRight |
|
Apostrof (') | 222 | ' | Quote |
|
Ważne uwagi do tabeli
event.whichto właściwość przestarzała, proszę używaćevent.key.event.codejest taki sam dla małej (a) i dużej (A) litery, jest to fizyczny klawisz.event.keyzwraca faktyczny znak z uwzględnieniem wielkości liter.- W Firefox wartości
event.whichdla klawiszyEqual,SemicoloniMinusróżnią się od Chrome/Edge/Safari (wskazano w uwagach). Kolejny powód, by nie używaćevent.which. - Przeglądarki oparte na Chromium i Firefox dają takie same
event.keyorazevent.codedla wszystkich wymienionych klawiszy. - Klawiatury wirtualne: specyfikacja UI Events wymaga, aby klawiatura wirtualna (mobilna, ekranowa), która odwzorowuje układ standardowej, zwracała poprawne
event.code. W praktyce przeglądarki mobilne (Chrome Android, Safari iOS) poprawnie obsługująkeydown/keyupdla głównych klawiszy, aleevent.codemoże być pusty dla niestandardowych układów.
Interaktywny trener

Do szybkiego sprawdzenia dowolnego kodu z artykułu proszę użyć trenera klawiaturowego: keyevents.netlify.app. Proszę najechać kursorem na obszar, naciskać klawisze i obserwować wartości event.key, event.code i event.which, a także stan flag modyfikatorów w czasie rzeczywistym. Kod źródłowy dostępny na GitHub.
Wideo: zdarzenia klawiaturowe w praktyce
Krótka praktyczna analiza keydown i keyup, działania modyfikatorów i skrótów klawiszowych z żywymi przykładami:
⁉️🤔 Często zadawane pytania
Czym event.key różni się od event.code?
event.keyzwraca wartość znakową z uwzględnieniem układu klawiatury i wielkości liter: dla klawisza A jest to"a"(lub"A"z Shift), dla polskiego układu,"ф".event.codezwraca fizyczny kod klawisza, taki sam dla wszystkich układów:"KeyA". Dla skrótów klawiszowych pewniejsze jestevent.code, nie zależy on od języka wprowadzania. Do wprowadzania tekstu proszę używaćevent.key.
Dlaczego keypress nie jest już używane?
Specyfikacja W3C oznaczyła
keypressjako przestarzałe: wyzwala się tylko dla klawiszy znakowych i nie przechwytuje modyfikatorów.Ctrl+C,Shift+Tabi innych kombinacji przezkeypressnie da się obsłużyć.keydownobejmuje wszystkie klawisze i jest wspierane jednolicie we wszystkich współczesnych przeglądarkach.
Czy można całkowicie zrezygnować z event.which i event.keyCode?
Tak, w 2026 roku można.
event.keyjest wspierane przez Chrome 51+, Firefox 29+, Safari 10.1+, Edge 79+. Jeśli Pana/Pani projekt nie celuje w IE11 lub Firefox 28, proszę używać tylkoevent.keyievent.code.
Jak obsłużyć długie przytrzymanie klawisza?
Proszę połączyć
keydownikeyup. Przykeydownproszę uruchomić timer lubrequestAnimationFrame, przykeyupzresetować. Dla sterowania w grach to standardowy wzorzec: klawisz wciśnięty, postać się porusza, zwolniony, zatrzymuje się.
Czy zdarzenia klawiaturowe działają na urządzeniach mobilnych?
keydownikeyupdziałają w przeglądarkach mobilnych przy użyciu zewnętrznej klawiatury Bluetooth. Klawiatura ekranowa generuje zdarzeniainput, a niekeydown/keyupdla wszystkich klawiszy, dlatego dla pól tekstowych na urządzeniach mobilnych lepiej używać zdarzeniainput.
Jak odróżnić lewy Shift od prawego?
Przez
event.code:"ShiftLeft"lub"ShiftRight".event.keydla obu zwraca"Shift". Analogicznie dlaControl,AltiMeta.
Co stosować w Pana/Pani projekcie
Jeśli pisze Pan/Pani nowy kod, proszę brać keydown jako główne zdarzenie, a do identyfikacji klawiszy event.key (znak) i event.code (fizyczny klawisz). To połączenie pokrywa wszystkie scenariusze: skróty klawiszowe, nawigację, sterowanie w grach, walidację formularzy.
Jeśli wspiera Pan/Pani produkt z kodem legacy na event.which lub event.keyCode, proszę zaplanować refaktoring. Zakres prac jest niewielki: wymiana w handlerach, a zysk to czysty, przewidywalny kod bez zoo różnic między przeglądarkami.
Proszę trzymać powyższą tabelę w zakładkach. Gdy następnym razem będzie Pan/Pani potrzebować kodu konkretnego klawisza, proszę otworzyć i skopiować odpowiednią wartość event.code, nie wspominając kodów numerycznych z epoki IE6.



