
📋 Codici tasto JavaScript: tabella completa di event.key, event.code e event.which
Un utente preme Escape e la modale non si chiude. Preme Invio nel campo di ricerca e non succede nulla. Ti suona familiare? La gestione della tastiera in JavaScript sembra semplice finché non inizi ad avere a che fare con tre eventi, una dozzina di proprietà e uno zoo di differenze tra browser.
Ogni keydown o keyup genera un oggetto KeyboardEvent con due dozzine di campi. Alcuni sono deprecati dall'era di IE, altri si comportano diversamente in Firefox e Chrome. E la documentazione MDN è piena di note «non utilizzare». Gli sviluppatori non hanno bisogno di un'altra specifica, hanno bisogno di un cheat sheet che funzioni.
Quella che segue è una guida di riferimento completa sugli eventi di tastiera: dall'anatomia del KeyboardEvent a snippet pronti all'uso per le scorciatoie da tastiera. Tieni la tabella dei codici tra i preferiti, ti servirà in un progetto su due.
💡 Panoramica rapida:
- Usa
keydowninvece dikeypress: funziona per qualsiasi tasto. event.keyrestituisce il simbolo del tasto,event.coderestituisce il suo codice fisico.event.keyCodeeevent.whichsono deprecati, non usarli nel nuovo codice.- La tabella seguente raccoglie i codici per tutti i tasti standard nei browser moderni.
Cosa c'è dentro KeyboardEvent
Quando un utente preme un tasto qualsiasi, il browser crea un oggetto KeyboardEvent, discendente di UIEvent, che a sua volta estende l'Event di base. Al suo interno ci sono le proprietà del tasto, lo stato dei modificatori, le informazioni sul layout.

La specifica UI Events è in evoluzione: compaiono nuove proprietà, quelle vecchie vengono deprecate. Il cambiamento principale degli ultimi anni è l'abbandono dei codici numerici (keyCode / charCode / which) a favore di event.key e event.code. Tutti i browser moderni supportano questa coppia e dovresti costruire la tua logica su di essi.
Il supporto dei browser è quasi completo: Chrome 51+, Firefox 29+, Safari 10.1+, Edge 79+. Se il tuo progetto non è bloccato su IE11, puoi dimenticarti di event.which.
Tre eventi: keydown, keypress e keyup
Il browser distingue tre eventi di tastiera. L'ordine di esecuzione è fisso:
- keydown, il tasto viene premuto (momento del contatto);
- keypress, il tasto è tenuto premuto e genera un carattere (solo per i tasti carattere);
- keyup, il tasto viene rilasciato.
Sottoscrizione a keydown tramite addEventListener:
1 const input = document.getElementById('type-here'); 2 3 input.addEventListener('keydown', function (event) { 4 console.log('Нажата:', event.key, '| Код:', event.code); 5 });
Per i gestori inline, usa un attributo dell'elemento:
1 <input type="text" id="type-here" onkeyup="handleKey(event)">
Se stampi l'oggetto evento nella console, vedrai la struttura completa con tutti i campi ereditati da UIEvent ed Event:

Perché keydown è la scelta principale
keypress è ufficialmente riconosciuto come deprecato. Si attiva solo per i tasti che producono un valore carattere e non intercetta i modificatori: non Alt, non Ctrl, non Shift, non Meta. Non puoi gestire Ctrl+Z o Shift+Tab tramite keypress.
La differenza tra keydown e keyup: keydown si attiva prima che il browser elabori il tasto; keyup si attiva dopo. Ne consegue un aspetto importante: event.preventDefault() dentro keydown annulla l'azione del browser (ad esempio, l'inserimento di un carattere in un campo), ma dentro keyup non lo fa. Per scorciatoie, validazione dell'input e controlli di gioco, ti serve keydown.
Tabella delle proprietà di KeyboardEvent
Proprietà / Metodo | Cosa restituisce | Stato |
|---|---|---|
| Valore carattere del tasto premuto: | Corrente |
| Codice fisico del tasto sulla tastiera: | Corrente |
|
| Corrente |
|
| Corrente |
|
| Corrente |
|
| Corrente |
|
| Corrente |
| Codice numerico del tasto (ad esempio | Deprecato |
| Codice Unicode del carattere | Deprecato |
| Codice numerico del tasto (analogo a | Deprecato |
Le ultime tre righe sono deprecate. Dove possibile, passa a event.key. Se devi supportare un vecchio browser, crea un 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 });
Ma nel 2026, questo codice serve solo per progetti legacy. event.key funziona ovunque.
Tasti modificatori e combinazioni
I tasti Control, Shift, Alt e Meta non eseguono azioni di per sé, ma modificano il comportamento di altri tasti. Premere Z produce la lettera "z", mentre Ctrl+Z esegue l'annullamento.
Le proprietà booleane dell'evento aiutano a tracciare un modificatore:
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 });
Lo stesso approccio si applica a qualsiasi combinazione: Ctrl+S (salva), Ctrl+Shift+N (nuova finestra), Alt+Tab (cambia). Controlla l'ordine: prima i modificatori tramite flag booleani, poi event.key per il tasto specifico. Questo rende la logica leggibile invece di annegarla in codici numerici.
Tabella completa dei codici tasto
Di seguito la tabella aggiornata per tutti i tasti standard. I valori event.key e event.code sono riportati come li restituiscono i browser moderni (Chrome, Firefox, Edge, Safari).
Navigazione e azioni
Tasto | event.which | event.key | event.code | Nota |
|---|---|---|---|---|
Backspace | 8 | Backspace | Backspace |
|
Tab | 9 | Tab | Tab |
|
Invio | 13 | Enter | Enter |
|
Shift (sinistro) | 16 | Shift | ShiftLeft |
|
Shift (destro) | 16 | Shift | ShiftRight |
|
Ctrl (sinistro) | 17 | Control | ControlLeft |
|
Ctrl (destro) | 17 | Control | ControlRight |
|
Alt (sinistro) | 18 | Alt | AltLeft |
|
Alt (destro) | 18 | Alt | AltRight |
|
Pausa / Interr | 19 | Pause | Pause |
|
Bloc Maiusc | 20 | CapsLock | CapsLock |
|
Escape | 27 | Escape | Escape |
|
Spazio | 32 |
| Space |
|
Pag Su | 33 | PageUp | PageUp |
|
Pag Giù | 34 | PageDown | PageDown |
|
Fine | 35 | End | End |
|
Home | 36 | Home | Home |
|
Freccia Sinistra | 37 | ArrowLeft | ArrowLeft |
|
Freccia Su | 38 | ArrowUp | ArrowUp |
|
Freccia Destra | 39 | ArrowRight | ArrowRight |
|
Freccia Giù | 40 | ArrowDown | ArrowDown |
|
Stamp | 44 | PrintScreen | PrintScreen |
|
Ins | 45 | Insert | Insert |
|
Canc | 46 | Delete | Delete |
|
Riga numerica (tastiera principale)
Tasto | 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 |
Lettere A-Z
Tasto | 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 restituisce il valore minuscolo per le lettere. event.code non dipende da maiuscole/minuscole o layout: KeyA indica il tasto fisico A, anche se il layout è russo e l'input è "Ф".
Tasti speciali
Tasto | event.which | event.key | event.code | Nota |
|---|---|---|---|---|
Windows sinistro | 91 | Meta | MetaLeft |
|
Windows destro | 92 | Meta | MetaRight |
|
Menu contestuale | 93 | ContextMenu | ContextMenu |
|
Tastierino numerico (Numpad)
Tasto | 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 Moltiplica | 106 | * | NumpadMultiply |
Numpad Addizione | 107 | + | NumpadAdd |
Numpad Sottrai | 109 | - | NumpadSubtract |
Numpad Decimale | 110 | . | NumpadDecimal |
Numpad Dividi | 111 | / | NumpadDivide |
Tasti funzione
Tasto | 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 |
Sistema e multimediali
Tasto | event.which | event.key | event.code | Nota |
|---|---|---|---|---|
Bloc Num | 144 | NumLock | NumLock |
|
Bloc Scorr | 145 | ScrollLock | ScrollLock |
|
Muto | 173 | AudioVolumeMute | AudioVolumeMute | In Firefox |
Volume Giù | 174 | AudioVolumeDown | AudioVolumeDown | In Firefox |
Volume Su | 175 | AudioVolumeUp | AudioVolumeUp | In Firefox |
Media Player | 181 | LaunchMediaPlayer | LaunchMediaPlayer | In Firefox |
Avvia App 1 | 182 | LaunchApplication1 | LaunchApplication1 | In Firefox |
Avvia App 2 | 183 | LaunchApplication2 | LaunchApplication2 | In Firefox |
Punteggiatura e simboli
Tasto | event.which | event.key | event.code | Nota |
|---|---|---|---|---|
Punto e virgola (;) | 186 | ; | Semicolon | In Firefox |
Uguale (=) | 187 | = | Equal | In Firefox |
Virgola ( | 188 |
| Comma |
|
Meno (-) | 189 | - | Minus | In Firefox |
Punto (.) | 190 | . | Period |
|
Barra (/) | 191 | / | Slash |
|
Accento grave ( | Backquote |
|
|
|
Parentesi quadra sinistra ([) | 219 | [ | BracketLeft |
|
Barra rovesciata () | 220 | \ | Backslash |
|
Parentesi quadra destra (]) | 221 | ] | BracketRight |
|
Apice (') | 222 | ' | Quote |
|
Note importanti sulla tabella
event.whichè una proprietà deprecata, usaevent.key.event.codeè identico per le lettere minuscole (a) e maiuscole (A), è il tasto fisico.event.keyrestituisce il carattere effettivo considerando maiuscole/minuscole.- In Firefox, i valori
event.whichper i tastiEqual,SemicoloneMinusdifferiscono da Chrome/Edge/Safari (annotato in tabella). Un altro motivo per non usareevent.which. - I browser basati su Chromium e Firefox restituiscono
event.keyeevent.codeidentici per tutti i tasti elencati. - Tastiere virtuali: la specifica UI Events richiede che una tastiera virtuale (mobile, su schermo) che replica un layout standard restituisca
event.codecorretto. In pratica, i browser mobile (Chrome Android, Safari iOS) gestiscono correttamentekeydown/keyupper i tasti principali, maevent.codepotrebbe essere vuoto per layout non standard.
Trainer interattivo

Per una verifica rapida di qualsiasi codice dell'articolo, usa il trainer di tastiera: keyevents.netlify.app. Sposta il cursore nell'area, premi i tasti e vedi in tempo reale i valori di event.key, event.code e event.which, oltre allo stato dei flag dei modificatori. Il codice sorgente è disponibile su GitHub.
Video: eventi di tastiera in pratica
Un'analisi pratica breve di keydown e keyup, con gestione di modificatori e scorciatoie ed esempi dal vivo:
⁉️🤔 Domande frequenti
Qual è la differenza tra event.key e event.code?
event.keyrestituisce il valore carattere considerando layout e maiuscole/minuscole: per il tasto A è"a"(o"A"con Shift), per il layout russo,"ф".event.coderestituisce il codice fisico del tasto, identico per tutti i layout:"KeyA". Per le scorciatoie,event.codeè più affidabile, non dipende dalla lingua di input. Per l'inserimento di testo, usaevent.key.
Perché keypress non si usa più?
La specifica W3C ha marcato
keypresscome deprecato: si attiva solo per i tasti carattere e non intercetta i modificatori. Non puoi gestireCtrl+C,Shift+Tabe altre combinazioni tramitekeypress.keydowncopre tutti i tasti ed è supportato in modo identico in tutti i browser moderni.
Si può abbandonare completamente event.which e event.keyCode?
Sì, nel 2026 puoi farlo.
event.keyè supportato in Chrome 51+, Firefox 29+, Safari 10.1+, Edge 79+. Se il tuo progetto non ha come target IE11 o Firefox 28, usa soloevent.keyeevent.code.
Come si gestisce la pressione prolungata di un tasto?
Combina
keydownekeyup. Sukeydownavvia un timer orequestAnimationFrame, sukeyupazzeralo. Per l'input di gioco, questo è il pattern standard: tasto premuto, il personaggio si muove, rilasciato, si ferma.
Gli eventi di tastiera funzionano sui dispositivi mobili?
keydownekeyupfunzionano nei browser mobile quando si usa una tastiera Bluetooth esterna. La tastiera su schermo genera eventiinput, nonkeydown/keyupper tutti i tasti, quindi per i campi di testo su mobile è meglio usare l'eventoinput.
Come si distingue lo Shift sinistro da quello destro?
Tramite
event.code:"ShiftLeft"o"ShiftRight".event.keyrestituisce"Shift"per entrambi. Lo stesso vale perControl,AlteMeta.
Cosa usare nel tuo progetto
Se stai scrivendo nuovo codice, prendi keydown come evento principale e, per l'identificazione del tasto, event.key (simbolo) e event.code (tasto fisico). Questa combinazione copre tutti gli scenari: scorciatoie da tastiera, navigazione, input di gioco, validazione form.
Se mantieni un prodotto con codice legacy basato su event.which o event.keyCode, pianifica un refactoring. Il volume di lavoro è ridotto: sostituzione nei gestori, ma il beneficio è un codice pulito e prevedibile senza uno zoo di differenze tra browser.
Tieni la tabella qui sopra tra i preferiti. La prossima volta che ti serve il codice per un tasto specifico, aprila e copia il valore event.code che ti serve, senza dover ricordare codici numerici dell'era di IE6.



