
📋 Codes de touches JavaScript : tableau complet de event.key, event.code et event.which
Un utilisateur appuie sur Échap, et la modale ne se ferme pas. Il tape Entrée dans le champ de recherche, et rien ne se produit. Cela vous semble familier? La gestion du clavier en JavaScript paraît simple jusqu’à ce que vous commenciez à jongler avec trois événements, une douzaine de propriétés et une jungle de différences entre navigateurs.
Chaque keydown ou keyup génère un objet KeyboardEvent doté d’une vingtaine de champs. Certains sont dépréciés depuis l’époque d’IE, d’autres se comportent différemment sous Firefox et Chrome. Et la documentation MDN est truffée de mentions «ne pas utiliser». Les développeurs n’ont pas besoin d’une énième spécification, ils ont besoin d’un aide-mémoire qui fonctionne.
Voici une référence complète sur les événements clavier: de l’anatomie de KeyboardEvent jusqu’aux extraits prêts à l’emploi pour les raccourcis clavier. Gardez le tableau de codes en favori, vous en aurez besoin dans pratiquement tous vos projets.
💡 Aperçu rapide:
- Utilisez
keydownplutôt quekeypress: il fonctionne pour toutes les touches. event.keydonne le symbole de la touche,event.coderenvoie son code physique.event.keyCodeetevent.whichsont dépréciés, ne les utilisez plus dans du nouveau code.- Le tableau ci-dessous regroupe les codes pour toutes les touches standard dans les navigateurs modernes.
Ce que contient un KeyboardEvent
Lorsqu’un utilisateur appuie sur une touche, le navigateur crée un objet KeyboardEvent, descendant de UIEvent, qui étend lui-même l’objet Event de base. On y trouve les propriétés de la touche, l’état des modificateurs et les informations de disposition du clavier.

La spécification UI Events évolue: de nouvelles propriétés apparaissent, d’anciennes deviennent dépréciées. Le principal changement de ces dernières années est l’abandon des codes numériques (keyCode / charCode / which) au profit de event.key et event.code. Tous les navigateurs modernes prennent en charge ce duo, et vous devriez bâtir votre logique sur eux.
La prise en charge par les navigateurs est quasi complète: Chrome 51+, Firefox 29+, Safari 10.1+, Edge 79+. Si votre projet n’est pas bloqué sur IE11, vous pouvez oublier event.which.
Trois événements: keydown, keypress et keyup
Le navigateur distingue trois événements clavier. L’ordre de déclenchement est fixe:
- keydown, la touche est enfoncée (moment du contact);
- keypress, la touche est maintenue et génère un caractère (uniquement pour les touches de caractère);
- keyup, la touche est relâchée.
S’abonner à keydown via addEventListener:
1 const input = document.getElementById('type-here'); 2 3 input.addEventListener('keydown', function (event) { 4 console.log('Нажата:', event.key, '| Код:', event.code); 5 });
Pour les gestionnaires en ligne, utilisez un attribut d’élément:
1 <input type="text" id="type-here" onkeyup="handleKey(event)">
Si vous affichez l’objet événement dans la console, vous verrez la structure complète avec tous les champs hérités de UIEvent et Event:

Pourquoi keydown est le choix principal
keypress est officiellement reconnu comme déprécié. Il ne se déclenche que pour les touches produisant une valeur de caractère et ne capture pas les modificateurs: ni Alt, ni Ctrl, ni Shift, ni Meta. Vous ne pouvez pas gérer Ctrl+Z ou Shift+Tab via keypress.
La différence entre keydown et keyup: keydown se déclenche avant que le navigateur ne traite la touche; keyup se déclenche après. Une conséquence importante en découle: event.preventDefault() dans keydown annule l’action du navigateur (par exemple, la saisie d’un caractère dans un champ), mais dans keyup, cela ne fonctionne pas. Pour les raccourcis, la validation de saisie et les contrôles de jeu, vous avez besoin de keydown.
Tableau des propriétés de KeyboardEvent
Propriété / Méthode | Ce qu’elle renvoie | Statut |
|---|---|---|
| Valeur caractère de la touche pressée: | Actuel |
| Code physique de la touche sur le clavier: | Actuel |
|
| Actuel |
|
| Actuel |
|
| Actuel |
|
| Actuel |
|
| Actuel |
| Code numérique de la touche (par exemple | Déprécié |
| Code Unicode du caractère | Déprécié |
| Code numérique de la touche (analogue à | Déprécié |
Les trois dernières lignes sont dépréciées. Partout où c’est possible, passez à event.key. Si vous devez prendre en charge un ancien navigateur, prévoyez une solution de repli:
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 });
Mais en 2026, ce type de code ne concerne que les projets legacy. event.key fonctionne partout.
Touches modificatrices et combinaisons
Les touches Control, Shift, Alt et Meta n’effectuent pas d’actions par elles-mêmes, mais modifient le comportement des autres touches. Appuyer sur Z donne la lettre «z», tandis que Ctrl+Z déclenche l’annulation.
Les propriétés booléennes de l’événement aident à suivre un modificateur:
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 });
La même approche s’applique à toutes les combinaisons: Ctrl+S (enregistrer), Ctrl+Shift+N (nouvelle fenêtre), Alt+Tab (basculer). Vérifiez dans l’ordre: d’abord les modificateurs via les indicateurs booléens, puis event.key pour la touche spécifique. Cela rend la logique lisible au lieu de se noyer dans des codes numériques.
Tableau complet des codes de touches
Voici le tableau actuel pour toutes les touches standard. Les valeurs event.key et event.code sont données telles que les navigateurs modernes (Chrome, Firefox, Edge, Safari) les renvoient.
Navigation et actions
Touche | event.which | event.key | event.code | Note |
|---|---|---|---|---|
Retour arrière | 8 | Backspace | Backspace |
|
Tabulation | 9 | Tab | Tab |
|
Entrée | 13 | Enter | Enter |
|
Shift (gauche) | 16 | Shift | ShiftLeft |
|
Shift (droite) | 16 | Shift | ShiftRight |
|
Ctrl (gauche) | 17 | Control | ControlLeft |
|
Ctrl (droite) | 17 | Control | ControlRight |
|
Alt (gauche) | 18 | Alt | AltLeft |
|
Alt (droite) | 18 | Alt | AltRight |
|
Pause / Arrêt défil | 19 | Pause | Pause |
|
Verr Maj | 20 | CapsLock | CapsLock |
|
Échap | 27 | Escape | Escape |
|
Espace | 32 |
| Space |
|
Page précédente | 33 | PageUp | PageUp |
|
Page suivante | 34 | PageDown | PageDown |
|
Fin | 35 | End | End |
|
Début | 36 | Home | Home |
|
Flèche gauche | 37 | ArrowLeft | ArrowLeft |
|
Flèche haut | 38 | ArrowUp | ArrowUp |
|
Flèche droite | 39 | ArrowRight | ArrowRight |
|
Flèche bas | 40 | ArrowDown | ArrowDown |
|
Impr écran | 44 | PrintScreen | PrintScreen |
|
Insertion | 45 | Insert | Insert |
|
Suppression | 46 | Delete | Delete |
|
Rangée numérique (clavier principal)
Touche | 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 |
Lettres A-Z
Touche | 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 renvoie la valeur en minuscule pour les lettres. event.code ne dépend ni de la casse ni de la disposition: KeyA désigne la touche physique A, même si la disposition est russe et que la saisie donne «Ф».
Touches spéciales
Touche | event.which | event.key | event.code | Note |
|---|---|---|---|---|
Windows gauche | 91 | Meta | MetaLeft |
|
Windows droite | 92 | Meta | MetaRight |
|
Menu contextuel | 93 | ContextMenu | ContextMenu |
|
Pavé numérique (Numpad)
Touche | event.which | event.key | event.code |
|---|---|---|---|
Pavé num 0 | 96 | 0 | Numpad0 |
Pavé num 1 | 97 | 1 | Numpad1 |
Pavé num 2 | 98 | 2 | Numpad2 |
Pavé num 3 | 99 | 3 | Numpad3 |
Pavé num 4 | 100 | 4 | Numpad4 |
Pavé num 5 | 101 | 5 | Numpad5 |
Pavé num 6 | 102 | 6 | Numpad6 |
Pavé num 7 | 103 | 7 | Numpad7 |
Pavé num 8 | 104 | 8 | Numpad8 |
Pavé num 9 | 105 | 9 | Numpad9 |
Pavé num Multiplier | 106 | * | NumpadMultiply |
Pavé num Addition | 107 | + | NumpadAdd |
Pavé num Soustraction | 109 | - | NumpadSubtract |
Pavé num Décimal | 110 | . | NumpadDecimal |
Pavé num Division | 111 | / | NumpadDivide |
Touches de fonction
Touche | 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 |
Système et multimédia
Touche | event.which | event.key | event.code | Note |
|---|---|---|---|---|
Verr Num | 144 | NumLock | NumLock |
|
Arrêt défil | 145 | ScrollLock | ScrollLock |
|
Muet | 173 | AudioVolumeMute | AudioVolumeMute | Sous Firefox |
Volume bas | 174 | AudioVolumeDown | AudioVolumeDown | Sous Firefox |
Volume haut | 175 | AudioVolumeUp | AudioVolumeUp | Sous Firefox |
Lecteur média | 181 | LaunchMediaPlayer | LaunchMediaPlayer | Sous Firefox |
Lancer App 1 | 182 | LaunchApplication1 | LaunchApplication1 | Sous Firefox |
Lancer App 2 | 183 | LaunchApplication2 | LaunchApplication2 | Sous Firefox |
Ponctuation et symboles
Touche | event.which | event.key | event.code | Note |
|---|---|---|---|---|
Point-virgule (;) | 186 | ; | Semicolon | Sous Firefox |
Égal (=) | 187 | = | Equal | Sous Firefox |
Virgule ( | 188 |
| Comma |
|
Moins (-) | 189 | - | Minus | Sous Firefox |
Point (.) | 190 | . | Period |
|
Slash (/) | 191 | / | Slash |
|
Accent grave ( | Backquote |
|
|
|
Crochet gauche ([) | 219 | [ | BracketLeft |
|
Barre oblique inversée () | 220 | \ | Backslash |
|
Crochet droit (]) | 221 | ] | BracketRight |
|
Apostrophe (') | 222 | ' | Quote |
|
Notes importantes sur le tableau
event.whichest une propriété dépréciée, utilisezevent.key.event.codeest identique pour les lettres minuscules (a) et majuscules (A), il s’agit de la touche physique.event.keyrenvoie le caractère réel en tenant compte de la casse.- Sous Firefox, les valeurs de
event.whichpour les touchesEqual,SemicolonetMinusdiffèrent de Chrome/Edge/Safari (indiqué dans le tableau). Une raison de plus de ne pas utiliserevent.which. - Les navigateurs basés sur Chromium et Firefox donnent des valeurs
event.keyetevent.codeidentiques pour toutes les touches listées. - Claviers virtuels: la spécification UI Events exige qu’un clavier virtuel (mobile, à l’écran) reproduisant une disposition standard renvoie un
event.codecorrect. En pratique, les navigateurs mobiles (Chrome Android, Safari iOS) gèrent correctementkeydown/keyuppour les touches principales, maisevent.codepeut être vide pour les dispositions non standard.
Entraîneur interactif

Pour une vérification rapide de tout code issu de l’article, utilisez l’entraîneur clavier: keyevents.netlify.app. Placez votre curseur dans la zone, appuyez sur des touches et visualisez en temps réel les valeurs de event.key, event.code et event.which, ainsi que l’état des indicateurs de modificateurs. Le code source est disponible sur GitHub.
Vidéo: les événements clavier en pratique
Un décryptage pratique et concis de keydown et keyup, la gestion des modificateurs et des raccourcis avec des exemples en direct:
⁉️🤔 Foire aux questions
Quelle est la différence entre event.key et event.code?
event.keyrenvoie la valeur du caractère en tenant compte de la disposition et de la casse: pour la touche A, c’est"a"(ou"A"avec Shift), pour une disposition russe,"ф".event.coderenvoie le code de la touche physique, identique pour toutes les dispositions:"KeyA". Pour les raccourcis,event.codeest plus fiable, il ne dépend pas de la langue de saisie. Pour la saisie de texte, utilisezevent.key.
Pourquoi keypress n’est-il plus utilisé?
La spécification W3C a marqué
keypresscomme déprécié: il ne se déclenche que pour les touches de caractère et ne capture pas les modificateurs. Vous ne pouvez pas gérerCtrl+C,Shift+Tabet d’autres combinaisons viakeypress.keydowncouvre toutes les touches et est pris en charge de manière identique par tous les navigateurs modernes.
Peut-on complètement abandonner event.which et event.keyCode?
Oui, en 2026, vous le pouvez.
event.keyest pris en charge dans Chrome 51+, Firefox 29+, Safari 10.1+, Edge 79+. Si votre projet ne cible pas IE11 ou Firefox 28, utilisez uniquementevent.keyetevent.code.
Comment gérer un appui long sur une touche?
Combinez
keydownetkeyup. Aukeydown, lancez un timer ourequestAnimationFrame, aukeyup, réinitialisez-le. Pour les contrôles de jeu, c’est le schéma standard: touche maintenue, le personnage se déplace; relâchée, il s’arrête.
Les événements clavier fonctionnent-ils sur les appareils mobiles?
keydownetkeyupfonctionnent dans les navigateurs mobiles lorsqu’un clavier Bluetooth externe est utilisé. Le clavier à l’écran génère des événementsinput, et nonkeydown/keyuppour toutes les touches. Pour les champs de texte sur mobile, il est donc préférable d’utiliser l’événementinput.
Comment distinguer la touche Shift gauche de la droite?
Via
event.code:"ShiftLeft"ou"ShiftRight".event.keyrenvoie"Shift"pour les deux. Même chose pourControl,AltetMeta.
Ce qu’il faut utiliser dans votre projet
Si vous écrivez du nouveau code, prenez keydown comme événement principal et, pour l’identification de la touche, event.key (symbole) et event.code (touche physique). Cette combinaison couvre tous les scénarios: raccourcis clavier, navigation, contrôles de jeu, validation de formulaire.
Si vous maintenez un produit avec du code legacy basé sur event.which ou event.keyCode, planifiez un refactoring. Le volume de travail est faible: un remplacement dans les gestionnaires, mais le bénéfice est un code propre et prévisible, sans la jungle des différences entre navigateurs.
Gardez le tableau ci-dessus en favori. La prochaine fois que vous aurez besoin du code pour une touche spécifique, ouvrez-le et copiez la valeur event.code nécessaire, sans avoir à vous souvenir des codes numériques de l’ère IE6.



