Skip to content

Wszystko o WordPressie, tworzeniu stron — i nie tylko

📋 Kody klawiszy JavaScript: pełna tabela event.key, event.code i event.which

📋 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ć keydown zamiast keypress: działa dla dowolnych klawiszy.
  • event.key podaje znak klawisza, event.code zwraca jego fizyczny kod.
  • event.keyCode oraz event.which są 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.

Hierarchia dziedziczenia interfejsu KeyboardEvent w JavaScript

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:

1const input = document.getElementById('type-here');
2
3input.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:

Obiekt zdarzenia keyup w konsoli przeglądarki ze wszystkimi właściwościami KeyboardEvent

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

event.key

Wartość znakowa naciśniętego klawisza: "a", "Enter" lub "ArrowUp"

Aktualne

event.code

Fizyczny kod klawisza na klawiaturze: "KeyA", "Enter" lub "ArrowUp"

Aktualne

event.altKey

true, jeśli wciśnięty jest Alt

Aktualne

event.ctrlKey

true, jeśli wciśnięty jest Control

Aktualne

event.shiftKey

true, jeśli wciśnięty jest Shift

Aktualne

event.metaKey

true, jeśli wciśnięty jest Meta (Windows / Command na Macu)

Aktualne

event.getModifierState()

true dla aktywnego stanu klawiszy CapsLock, NumLock, Alt, Control, Shift lub Meta

Aktualne

event.keyCode

Numeryczny kod klawisza (np. 65 dla A)

Przestarzałe

event.charCode

Kod Unicode znaku

Przestarzałe

event.which

Numeryczny kod klawisza (analogiczny do keyCode)

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:

1window.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:

1document.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

event.shiftKey = true

Shift (prawy)

16

Shift

ShiftRight

event.shiftKey = true

Ctrl (lewy)

17

Control

ControlLeft

event.ctrlKey = true

Ctrl (prawy)

17

Control

ControlRight

event.ctrlKey = true

Alt (lewy)

18

Alt

AltLeft

event.altKey = true

Alt (prawy)

18

Alt

AltRight

event.altKey = true

Pause / Break

19

Pause

Pause

Caps Lock

20

CapsLock

CapsLock

Escape

27

Escape

Escape

Spacja

32

Space

event.key, pojedyncza spacja

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

event.metaKey = true

Prawy Windows

92

Meta

MetaRight

event.metaKey = true

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 event.which = 181, event.code = VolumeMute

Ściszanie

174

AudioVolumeDown

AudioVolumeDown

W Firefox event.which = 182, event.code = VolumeDown

Pogłaśnianie

175

AudioVolumeUp

AudioVolumeUp

W Firefox event.which = 183, event.code = VolumeUp

Odtwarzacz multimedialny

181

LaunchMediaPlayer

LaunchMediaPlayer

W Firefox event.which = 0, event.code = MediaSelect

Uruchom aplikację 1

182

LaunchApplication1

LaunchApplication1

W Firefox event.which = 0, event.code = LaunchApp1

Uruchom aplikację 2

183

LaunchApplication2

LaunchApplication2

W Firefox event.which = 0, event.code = LaunchApp2

Znaki interpunkcyjne i symbole

Klawisz

event.which

event.key

event.code

Uwaga

Średnik (;)

186

;

Semicolon

W Firefox event.which = 59

Równa się (=)

187

=

Equal

W Firefox event.which = 61

Przecinek (,)

188

,

Comma

Minus (-)

189

-

Minus

W Firefox event.which = 173

Kropka (.)

190

.

Period

Ukośnik (/)

191

/

Slash

Apostrof odwrócony () | 192 |

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.which to właściwość przestarzała, proszę używać event.key.
  • event.code jest taki sam dla małej (a) i dużej (A) litery, jest to fizyczny klawisz. event.key zwraca faktyczny znak z uwzględnieniem wielkości liter.
  • W Firefox wartości event.which dla klawiszy Equal, Semicolon i Minus róż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.key oraz event.code dla 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/keyup dla głównych klawiszy, ale event.code może być pusty dla niestandardowych układów.

Interaktywny trener

Interaktywny symulator zdarzeń klawiaturowych JavaScript

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.key zwraca 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.code zwraca fizyczny kod klawisza, taki sam dla wszystkich układów: "KeyA". Dla skrótów klawiszowych pewniejsze jest event.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 keypress jako przestarzałe: wyzwala się tylko dla klawiszy znakowych i nie przechwytuje modyfikatorów. Ctrl+C, Shift+Tab i innych kombinacji przez keypress nie da się obsłużyć. keydown obejmuje 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.key jest 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ć tylko event.key i event.code.

Jak obsłużyć długie przytrzymanie klawisza?

Proszę połączyć keydown i keyup. Przy keydown proszę uruchomić timer lub requestAnimationFrame, przy keyup zresetować. 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?

keydown i keyup działają w przeglądarkach mobilnych przy użyciu zewnętrznej klawiatury Bluetooth. Klawiatura ekranowa generuje zdarzenia input, a nie keydown/keyup dla wszystkich klawiszy, dlatego dla pól tekstowych na urządzeniach mobilnych lepiej używać zdarzenia input.

Jak odróżnić lewy Shift od prawego?

Przez event.code: "ShiftLeft" lub "ShiftRight". event.key dla obu zwraca "Shift". Analogicznie dla Control, Alt i Meta.

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.