Skip to content

Tudo para WordPress, desenvolvimento web — e não só

📋 Códigos de tecla JavaScript: tabela completa de event.key, event.code e event.which

📋 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 keydown em vez de keypress: funciona para qualquer tecla.
  • event.key devolve o símbolo da tecla, event.code devolve o seu código físico.
  • event.keyCode e event.which estã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.

Hierarquia de herança da interface KeyboardEvent em JavaScript

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:

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

O objeto de evento keyup na consola do navegador com todas as propriedades KeyboardEvent

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

event.key

Valor do caractere da tecla pressionada: "a", "Enter" ou "ArrowUp"

Atual

event.code

Código físico da tecla no teclado: "KeyA", "Enter" ou "ArrowUp"

Atual

event.altKey

true se Alt estiver pressionada

Atual

event.ctrlKey

true se Control estiver pressionada

Atual

event.shiftKey

true se Shift estiver pressionada

Atual

event.metaKey

true se Meta estiver pressionada (Windows / Command no Mac)

Atual

event.getModifierState()

true para o estado ativo das teclas CapsLock, NumLock, Alt, Control, Shift ou Meta

Atual

event.keyCode

Código numérico da tecla (por exemplo 65 para A)

Obsoleto

event.charCode

Código Unicode do caractere

Obsoleto

event.which

Código numérico da tecla (análogo a keyCode)

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:

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});

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:

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});

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.

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

event.shiftKey = true

Shift (direita)

16

Shift

ShiftRight

event.shiftKey = true

Ctrl (esquerda)

17

Control

ControlLeft

event.ctrlKey = true

Ctrl (direita)

17

Control

ControlRight

event.ctrlKey = true

Alt (esquerda)

18

Alt

AltLeft

event.altKey = true

Alt (direita)

18

Alt

AltRight

event.altKey = true

Pause / Break

19

Pause

Pause

Caps Lock

20

CapsLock

CapsLock

Escape

27

Escape

Escape

Espaço

32

Space

event.key - espaço simples

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

event.metaKey = true

Windows direita

92

Meta

MetaRight

event.metaKey = true

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

Diminuir volume

174

AudioVolumeDown

AudioVolumeDown

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

Aumentar volume

175

AudioVolumeUp

AudioVolumeUp

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

Reprodutor multimédia

181

LaunchMediaPlayer

LaunchMediaPlayer

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

Iniciar App 1

182

LaunchApplication1

LaunchApplication1

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

Iniciar App 2

183

LaunchApplication2

LaunchApplication2

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

Pontuação e símbolos

Tecla

event.which

event.key

event.code

Nota

Ponto e vírgula (;)

186

;

Semicolon

No Firefox event.which = 59

Igual (=)

187

=

Equal

No Firefox event.which = 61

Vírgula (,)

188

,

Comma

Menos (-)

189

-

Minus

No Firefox event.which = 173

Ponto (.)

190

.

Period

Barra (/)

191

/

Slash

Acento grave () | 192 |

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, utilize event.key.
  • event.code é idêntico para letras minúsculas (a) e maiúsculas (A), é a tecla física. event.key devolve o caractere real considerando a capitalização.
  • No Firefox, os valores de event.which para as teclas Equal, Semicolon e Minus diferem do Chrome/Edge/Safari (anotado na tabela). Outra razão para não usar event.which.
  • Os navegadores baseados em Chromium e o Firefox devolvem event.key e event.code idê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.code correto. Na prática, os navegadores móveis (Chrome Android, Safari iOS) tratam corretamente keydown/keyup para as teclas principais, mas event.code pode estar vazio para layouts não padrão.

Treinador interativo

Treinador interativo de eventos de teclado em JavaScript

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.key devolve 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.code devolve 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, utilize event.key.

Porque é que o keypress já não é utilizado?

A especificação W3C marcou o keypress como obsoleto: só é disparado para teclas de caractere e não capta modificadores. Não é possível tratar Ctrl+C, Shift+Tab e outras combinações através do keypress. O keydown cobre 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 apenas event.key e event.code.

Como se trata uma pressão longa de tecla?

Combine keydown e keyup. No keydown inicie um temporizador ou requestAnimationFrame, no keyup reinicie-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 keydown e o keyup funcionam nos navegadores móveis quando se utiliza um teclado Bluetooth externo. O teclado no ecrã gera eventos input, não keydown/keyup para todas as teclas, pelo que para campos de texto em mobile é melhor usar o evento input.

Como se distingue o Shift esquerdo do direito?

Através de event.code: "ShiftLeft" ou "ShiftRight". event.key devolve "Shift" para ambos. O mesmo para Control, Alt e Meta.

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.