
📋 Códigos de tecla JavaScript: tabela completa de event.key, event.code e event.which
Um utilizador pressiona Escape e o modal não fecha. Prime Enter no campo de pesquisa e nada acontece. Parece-lhe familiar? O tratamento de teclado em JavaScript parece simples até começarmos a lidar com três eventos, uma dúzia de propriedades e um zoológico de diferenças entre navegadores.
Cada keydown ou keyup gera um objeto KeyboardEvent com duas dezenas de campos. Alguns estão obsoletos desde a era do IE, outros comportam-se de forma diferente no Firefox e no Chrome. E a documentação da MDN está repleta de notas «não utilizar». Os programadores não precisam de outra especificação, precisam de uma folha de consulta que funcione.
Segue-se uma referência completa sobre eventos de teclado: da anatomia do KeyboardEvent a trechos de código prontos para atalhos de teclado. Guarde a tabela de códigos nos favoritos, vai precisar dela em quase todos os projetos.
💡 Visão geral rápida:
- Use
keydownem vez dekeypress: funciona para qualquer tecla. event.keydevolve o símbolo da tecla,event.codedevolve o seu código físico.event.keyCodeeevent.whichestão obsoletos, não os utilize em código novo.- A tabela abaixo reúne os códigos de todas as teclas padrão nos navegadores modernos.
O que contém o KeyboardEvent
Quando um utilizador pressiona uma tecla, o navegador cria um objeto KeyboardEvent, descendente de UIEvent, que por sua vez estende o Event base. No seu interior estão as propriedades da tecla, o estado dos modificadores e a informação de layout.

A especificação UI Events está em evolução: surgem novas propriedades e as antigas tornam-se obsoletas. A principal mudança nos últimos anos é o abandono dos códigos numéricos (keyCode / charCode / which) a favor de event.key e event.code. Todos os navegadores modernos suportam este par e deve construir a sua lógica com base neles.
O suporte dos navegadores é praticamente total: Chrome 51+, Firefox 29+, Safari 10.1+, Edge 79+. Se o seu projeto não estiver preso ao IE11, pode esquecer o event.which.
Três eventos: keydown, keypress e keyup
O navegador distingue três eventos de teclado. A ordem de disparo é fixa:
- keydown, a tecla é pressionada (momento do contacto);
- keypress, a tecla é mantida e gera um caractere (apenas para teclas de caractere);
- keyup, a tecla é libertada.
Subscrever o 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 });
Para handlers inline, utilize um atributo do elemento:
1 <input type="text" id="type-here" onkeyup="handleKey(event)">
Se enviar o objeto de evento para a consola, verá a estrutura completa com todos os campos herdados de UIEvent e Event:

Porque é que o keydown é a escolha principal
O keypress está oficialmente reconhecido como obsoleto. Só é disparado para teclas que produzem um valor de caractere e não capta modificadores: nem Alt, nem Ctrl, nem Shift, nem Meta. Não é possível tratar Ctrl+Z ou Shift+Tab através do keypress.
A diferença entre keydown e keyup: o keydown é disparado antes de o navegador processar a tecla; o keyup é disparado depois. Daí decorre uma consequência importante: event.preventDefault() dentro de keydown cancela a ação do navegador (por exemplo, inserir um caractere num campo), mas dentro de keyup não. Para atalhos, validação de input e controlos de jogo, precisa do keydown.
Tabela de propriedades do KeyboardEvent
Propriedade / Método | O que devolve | Estado |
|---|---|---|
| Valor do caractere da tecla pressionada: | Atual |
| Código físico da tecla no teclado: | Atual |
|
| Atual |
|
| Atual |
|
| Atual |
|
| Atual |
|
| Atual |
| Código numérico da tecla (por exemplo | Obsoleto |
| Código Unicode do caractere | Obsoleto |
| Código numérico da tecla (análogo a | Obsoleto |
As três últimas linhas estão obsoletas. Sempre que possível, mude para event.key. Se tiver de suportar um navegador antigo, crie um 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 });
Mas em 2026, esse código é apenas para projetos legados. O event.key funciona em todo o lado.
Teclas modificadoras e combinações
As teclas Control, Shift, Alt e Meta não executam ações por si mesmas, mas alteram o comportamento de outras teclas. Pressionar Z produz a letra «z», enquanto Ctrl+Z executa o comando desfazer.
As propriedades booleanas do evento ajudam a rastrear um modificador:
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 });
A mesma abordagem aplica-se a quaisquer combinações: Ctrl+S (guardar), Ctrl+Shift+N (nova janela), Alt+Tab (alternar). Verifique a ordem: primeiro os modificadores através de flags booleanas, depois event.key para a tecla específica. Isto torna a lógica legível, em vez de a afogar em códigos numéricos.
Tabela completa de códigos de teclas
Segue-se a tabela atual para todas as teclas padrão. Os valores event.key e event.code são apresentados tal como os navegadores modernos (Chrome, Firefox, Edge, Safari) os devolvem.
Navegação e ações
Tecla | event.which | event.key | event.code | Nota |
|---|---|---|---|---|
Backspace | 8 | Backspace | Backspace |
|
Tab | 9 | Tab | Tab |
|
Enter | 13 | Enter | Enter |
|
Shift (esquerda) | 16 | Shift | ShiftLeft |
|
Shift (direita) | 16 | Shift | ShiftRight |
|
Ctrl (esquerda) | 17 | Control | ControlLeft |
|
Ctrl (direita) | 17 | Control | ControlRight |
|
Alt (esquerda) | 18 | Alt | AltLeft |
|
Alt (direita) | 18 | Alt | AltRight |
|
Pause / Break | 19 | Pause | Pause |
|
Caps Lock | 20 | CapsLock | CapsLock |
|
Escape | 27 | Escape | Escape |
|
Espaço | 32 |
| Space |
|
Page Up | 33 | PageUp | PageUp |
|
Page Down | 34 | PageDown | PageDown |
|
End | 35 | End | End |
|
Home | 36 | Home | Home |
|
Seta para a esquerda | 37 | ArrowLeft | ArrowLeft |
|
Seta para cima | 38 | ArrowUp | ArrowUp |
|
Seta para a direita | 39 | ArrowRight | ArrowRight |
|
Seta para baixo | 40 | ArrowDown | ArrowDown |
|
Print Screen | 44 | PrintScreen | PrintScreen |
|
Insert | 45 | Insert | Insert |
|
Delete | 46 | Delete | Delete |
|
Linha numérica (teclado principal)
Tecla | 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 |
Letras A-Z
Tecla | 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 devolve o valor em minúsculas para as letras. event.code não depende de maiúsculas/minúsculas nem do layout: KeyA significa a tecla física A, mesmo que o layout seja russo e o input seja «Ф».
Teclas especiais
Tecla | event.which | event.key | event.code | Nota |
|---|---|---|---|---|
Windows esquerda | 91 | Meta | MetaLeft |
|
Windows direita | 92 | Meta | MetaRight |
|
Menu de contexto | 93 | ContextMenu | ContextMenu |
|
Teclado numérico (Numpad)
Tecla | 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 Multiplicar | 106 | * | NumpadMultiply |
Numpad Adicionar | 107 | + | NumpadAdd |
Numpad Subtrair | 109 | - | NumpadSubtract |
Numpad Decimal | 110 | . | NumpadDecimal |
Numpad Dividir | 111 | / | NumpadDivide |
Teclas de função
Tecla | 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 multimédia
Tecla | event.which | event.key | event.code | Nota |
|---|---|---|---|---|
Num Lock | 144 | NumLock | NumLock |
|
Scroll Lock | 145 | ScrollLock | ScrollLock |
|
Sem som | 173 | AudioVolumeMute | AudioVolumeMute | No Firefox |
Diminuir volume | 174 | AudioVolumeDown | AudioVolumeDown | No Firefox |
Aumentar volume | 175 | AudioVolumeUp | AudioVolumeUp | No Firefox |
Reprodutor multimédia | 181 | LaunchMediaPlayer | LaunchMediaPlayer | No Firefox |
Iniciar App 1 | 182 | LaunchApplication1 | LaunchApplication1 | No Firefox |
Iniciar App 2 | 183 | LaunchApplication2 | LaunchApplication2 | No Firefox |
Pontuação e símbolos
Tecla | event.which | event.key | event.code | Nota |
|---|---|---|---|---|
Ponto e vírgula (;) | 186 | ; | Semicolon | No Firefox |
Igual (=) | 187 | = | Equal | No Firefox |
Vírgula ( | 188 |
| Comma |
|
Menos (-) | 189 | - | Minus | No Firefox |
Ponto (.) | 190 | . | Period |
|
Barra (/) | 191 | / | Slash |
|
Acento grave ( | Backquote |
|
|
|
Parêntese reto esquerdo ([) | 219 | [ | BracketLeft |
|
Barra invertida () | 220 | \ | Backslash |
|
Parêntese reto direito (]) | 221 | ] | BracketRight |
|
Plíca (') | 222 | ' | Quote |
|
Notas importantes da tabela
event.whiché uma propriedade obsoleta, utilizeevent.key.event.codeé idêntico para letras minúsculas (a) e maiúsculas (A), é a tecla física.event.keydevolve o caractere real considerando a capitalização.- No Firefox, os valores de
event.whichpara as teclasEqual,SemicoloneMinusdiferem do Chrome/Edge/Safari (anotado na tabela). Outra razão para não usarevent.which. - Os navegadores baseados em Chromium e o Firefox devolvem
event.keyeevent.codeidênticos para todas as teclas listadas. - Teclados virtuais: a especificação UI Events exige que um teclado virtual (móvel, no ecrã) que reproduza um layout padrão devolva o
event.codecorreto. Na prática, os navegadores móveis (Chrome Android, Safari iOS) tratam corretamentekeydown/keyuppara as teclas principais, masevent.codepode estar vazio para layouts não padrão.
Treinador interativo

Para uma verificação rápida de qualquer código do artigo, utilize o treinador de teclado: keyevents.netlify.app. Mova o cursor para a área, pressione teclas e veja os valores de event.key, event.code e event.which, bem como o estado das flags dos modificadores em tempo real. O código-fonte está disponível no GitHub.
Vídeo: eventos de teclado na prática
Uma análise prática e breve do keydown e keyup, trabalho com modificadores e atalhos com exemplos ao vivo:
⁉️🤔 Perguntas frequentes
Qual é a diferença entre event.key e event.code?
event.keydevolve o valor do caractere considerando o layout e a capitalização: para a tecla A é"a"(ou"A"com Shift), para o layout russo,"ф".event.codedevolve o código físico da tecla, idêntico para todos os layouts:"KeyA". Para atalhos,event.codeé mais fiável, não depende do idioma de entrada. Para entrada de texto, utilizeevent.key.
Porque é que o keypress já não é utilizado?
A especificação W3C marcou o
keypresscomo obsoleto: só é disparado para teclas de caractere e não capta modificadores. Não é possível tratarCtrl+C,Shift+Tabe outras combinações através dokeypress. Okeydowncobre todas as teclas e é suportado de forma idêntica em todos os navegadores modernos.
É possível abandonar completamente o event.which e o event.keyCode?
Sim, em 2026 é possível. O
event.keyé suportado no Chrome 51+, Firefox 29+, Safari 10.1+, Edge 79+. Se o seu projeto não tiver como alvo o IE11 ou o Firefox 28, utilize apenasevent.keyeevent.code.
Como se trata uma pressão longa de tecla?
Combine
keydownekeyup. Nokeydowninicie um temporizador ourequestAnimationFrame, nokeyupreinicie-o. Para input de jogo, este é o padrão: tecla pressionada, personagem move-se; libertada, para.
Os eventos de teclado funcionam em dispositivos móveis?
O
keydowne okeyupfuncionam nos navegadores móveis quando se utiliza um teclado Bluetooth externo. O teclado no ecrã gera eventosinput, nãokeydown/keyuppara todas as teclas, pelo que para campos de texto em mobile é melhor usar o eventoinput.
Como se distingue o Shift esquerdo do direito?
Através de
event.code:"ShiftLeft"ou"ShiftRight".event.keydevolve"Shift"para ambos. O mesmo paraControl,AlteMeta.
O que usar no seu projeto
Se está a escrever código novo, adote o keydown como evento principal e, para identificação da tecla, event.key (símbolo) e event.code (tecla física). Esta combinação cobre todos os cenários: atalhos de teclado, navegação, input de jogo, validação de formulários.
Se mantém um produto com código legado em event.which ou event.keyCode, planeie uma refatoração. O volume de trabalho é pequeno: substituição nos handlers, mas o benefício é um código limpo e previsível, sem um zoológico de diferenças entre navegadores.
Guarde a tabela acima nos favoritos. Quando precisar novamente do código de uma tecla específica, abra-a e copie o valor event.code necessário, sem ter de recordar códigos numéricos da era do IE6.



