Artigo original: JavaScript Keycode List – Keypress Event Key Codes for Enter, Space, Backspace, and More
Os eventos de teclado em Javascript ajudam a capturar interações do usuário com o teclado.
Da mesma forma que em muitos outros eventos do Javascript, a interface do KeyboardEvent
nos fornece todas as propriedades e métodos necessários para lidar com cada tecla pressionada pelo usuário.
Existem diversos artigos sobre como este método funciona e sobre como utilizá-lo. Ao mesmo tempo, a w3.org (texto em inglês) continua a atualizar as especificações, adicionando novas propriedades e removendo algumas existentes, marcando alguns códigos como legado.
Por conta disso, é essencial que os desenvolvedores da web tenham o hábito da aprendizagem contínua com relação à interface KeyboardEvent
para saberem o que exatamente eles devem utilizar e o que não é mais relevante.
Neste artigo, vamos aprender sobre:
- A interface KeyboardEvent.
- Os tipos de eventos de teclado que devemos ter em mente.
- Os tipos de eventos de teclado que talvez nunca utilizaremos.
- As propriedades que são necessárias na prática e como diferentes navegadores lidam com elas.
- O que já não é mais usado e o que ainda está em uso.
- Um exercício prático para tentarmos fazer as coisas à medida que aprendemos.
- Por fim, a lista atual de códigos de teclas para referência e uso no futuro.
Espero que você aproveite.
A interface KeyboardEvent e os tipos de eventos
A interface de tecla (KeyboardEvent) fornece informações usando as constantes definidas, propriedades e um método único (neste momento). Ela é uma extensão da interface UIEvent
, a qual, por sua vez, é uma extensão da interface Event
.

Existem três tipos de eventos, primordialmente: keydown
, keypress
e keyup
. Podemos obter informações contextual destes eventos a partir das propriedades e métodos da interface KeyboardEvent
.
Você pode adicionar cada um destes eventos a um elemento HTML ou a um objeto document
utilizando o método addEventListener
. Segue um exemplo de listener do evento keydown
onde o id é 'digite-aqui':
let elem = document.getElementById('digite-aqui');
elem.addEventListener("keydown", function (event) {
// O evento do parâmetro é do tipo KeyboardEvent
addRow(event);
});
Como alternativa, você pode os métodos de tratamento, como onKeydown(event)
, onKeyup(event)
, onKeypress(event)
, com o elemento para tratar dos eventos de teclado. Abaixo, vemos um exemplo de como lidar com um evento de keyup
em um elemento de input:
<input type="text" id="digite-aqui" onkeyup="façaAlgo(event)">
Se você imprimir no console do navegador o objeto event
, verá todas as propriedades e métodos junto com aqueles que ele herda das interfaces.

a
enquanto tratava do evento keyup
Experimente esse evento interativo no exercício
Antes de avançarmos, que tal um exercício para explorarmos todos os eventos de teclado, suas propriedades, características e assim por diante? Acredito que será ótimo utilizá-lo juntamente com este artigo e posteriormente.
Você precisa apenas colocar seu cursor em qualquer lugar do aplicativo incorporado abaixo e pressionar qualquer tecla para ver a informação contextual sobre ela.
Você também pode filtrar os eventos, desmarcando-os nas caixas de seleções que estão na parte superior. Experimente:
Se tiver quaisquer problemas acessando o exercício acima, pode acessar a ferramenta diretamente por este link: https://keyevents.netlify.app/
Você também pode encontrar o código-fonte da demonstração aqui: https://github.com/atapas/js-keyevents-demo
keydown, keypress, keyup – qual você deve usar?
O eventos de tecla são:
keydown
: dispara quando qualquer tecla é pressionada.keypress
: dispara quando uma tecla que retorna um valor de caractere é pressionada. Por exemplo, se você pressionar a telaa
, este evento vai disparar a letraa
, que retorna o valor97
. Por outro lado, este evento não vai funcionar quando pressionar a teclashift
pois ela não retorna um valor.keyup
: dispara quando qualquer tecla é liberada.
Se todos os eventos estão vinculados a um elemento do DOM, a ordem de funcionamento seria:
- Primeiro, keydown
- Depois, pressione (com a condição de estado acima)
- Por último, keyup
Entre estes eventos, o mais utilizado é (ou deveria ser) keydown
, pois:
- O evento
keydown
tem uma cobertura máxima de contextualização de informação. O eventokeypress
funciona apenas com um subconjunto de teclas. Você não consegue capturar Alt, Ctrl, Shift, Meta e outras eventos de teclas similares com keypress. Isto também significa que não podemos disparar eventos com a combinação de teclas comoCtrl+Z
,Shift+Tab
e assim por diante. - Além disso, o evento
keypress
já não deve mais ser utilizado. Isto é o suficiente para evitá-lo. - Embora os eventos
keydown
ekeyup
tratem de todas as teclas e muitos navegadores oferecem suporte a eles, existem algumas diferenças que deixam okeydown
a frente dekeyup
. O evento keydown dispara antes do navegador processar a tecla. Se você cancelar o evento keydown (digo, utilizandoevent.preventDefault()
) a ação do navegador também será cancelada. No caso do evento keyup, a ação dos navegadores não será cancelada mesmo que você cancele o evento.
No exemplo abaixo, utilizamos event.preventDefault()
ao disparar os eventos keydown
e keyup
. A ação do navegador escreve o caractere dentro da caixa de texto isso não vai acontecer no caso do evento keydown
, mas acontecerá no evento de keyup
.
Depois desta explicação, vemos que o evento keydown
é claramente o vencedor e deve ser tornar o tipo de evento mais popular (mais usado).
Como utilizar as propriedades dos eventos de tecla pressionada na prática
Esta é a pergunta mais importante! A resposta mais curta é: depende. Mas de quê? Depende de:
- Qual o nível de suporte do navegador para a sua aplicação
- O quanto o código da sua aplicação é antigo e o quanto você está disposto a refatorar?
Antes de chegarmos nisso, contudo, vamos ver um pouco sobre propriedades e métodos úteis da interface keyboardEvent
.
PROPRIEDADE/MÉTODO | DESCRIÇÃO | DESCONTINUADO/DESATUALIZADO |
---|---|---|
altKey | Retorna um booleano (true/false). O valor é true quando a tecla Alt é pressionada. | Não |
ctrlKey | Retorna um booleano (true/false). O valor é true quando a tecla Control é pressionada. | No |
shiftKey | Retorna um booleano (true/false). O valor é true quando a tecla Shift é pressionada. | Não |
metaKey | Retorna um booleano (true/false). O valor é true quando qualquer uma das teclas Meta é pressionada. | Não |
code | O valor de código da tecla física. | Não |
key | O valor real da tecla pressionada. | Não |
método getModifierState() | Retorna um booleano (true/false). O valor true indica o estado on dessas teclas, CapsLock , NumLock , Alt , Control , Shift , Meta , etc. | Não |
charCode | Retorna o valor Unicode. Foi descontinuado e devemos usar a propriedade key em seu lugar. | Sim |
keyCode | Retorna o valor numérico da tecla pressionada. Foi descontinuado e devemos utilizar a propriedade key em seu lugar. | Sim |
which | Retorna o valor numérico do valor pressionado. Foi descontinuado e devemos usar a propriedade key no seu lugar. | Sim |
As últimas três propriedades foram descontinuadas e deve-se utilizar a propriedade key
no lugar delas. A propriedade key
possui um suporte mais amplo dos navegadores (texto em inglês).
Encontramos suporte nos seguintes navegadores:
- Microsoft Edge: Versão >= 79
- Firefox: Versão >= 29
- Google Chrome: Versão >= 51
- Safari: Versão >= 10.1
Então, enquanto você não estiver utilizando nenhuma versão antiga de navegadores, a propriedade event.key
deve ser o suficiente para identificar uma tecla. Caso você tenha que fornecer suporte a navegadores antigos, a melhor saída seria a propriedade event.which
.
window.addEventListener("keydown", function (event) {
if (event.key !== undefined) {
// Handle the event with KeyboardEvent.key
} else if (event.which !== undefined) {
// Handle the event with KeyboardEvent.which
}
});
Se o seu código possui propriedades descontinuadas e se você tiver a oportunidade de refatorar este código, sempre será melhor a fazer.
Teclas modificadoras
As teclas modificadoras são as teclas especiais do seu teclado que mudam o comportamento padrão de outras teclas. Control
, Shift
e Alt
são algumas das teclas modificadoras. Quando uma tecla modificadora é combinada com outra tecla, você pode esperar que uma ação diferente ocorra.
Por exemplo, se você apertar a tecla z
, deve retornar a letra e o código dela. Se você combinar com o modificador Control
e pressionar Control+z
, provavelmente terá a ação de desfazer a operação. Vamos ver isto com mais alguns exemplos na próxima seção.
As propriedades, event.altKey
, event.ctrlKey
, event.shiftKey
e outras ajudam a identificar qual modificador foi pressionado.
Combinação de teclas
Podemos combinar diversas teclas e realizar ações baseadas na combinação delas. O código abaixo mostra como combinar Control
e z
para definir uma ação:
document
.getElementById("to_focus")
.addEventListener("keydown", function(event) {
if (event.ctrlKey && event.key === "z") {
// Realiza uma ação, talvez até a operação de 'desfazer'
}
});
Segue outro exemplo de combinação de teclas. Experimente:
Lista Completa de valores de eventos de teclado
A tabela abaixo mostra a lista de teclas com os valores de event.which
, event.key
e event.code
.
NOME DA TECLA | EVENT.WHICH | EVENT.KEY | EVENT.CODE | OBS.: |
---|---|---|---|---|
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 | |
barra de espaço | 32 | Space | O valor de event.key é um único espaço. | |
page up | 33 | PageUp | PageUp | |
page down | 34 | PageDown | PageDown | |
end | 35 | End | End | |
home | 36 | Home | Home | |
seta da esquerda | 37 | ArrowLeft | ArrowLeft | |
seta para cima | 38 | ArrowUp | ArrowUp | |
seta da direita | 39 | ArrowRight | ArrowRight | |
seta para baixo | 40 | ArrowDown | ArrowDown | |
print screen | 44 | PrintScreen | PrintScreen | |
insert | 45 | Insert | Insert | |
delete | 46 | Delete | Delete | |
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 | |
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 | |
tecla do Windows esquerda | 91 | Meta | MetaLeft | event.metaKey é true |
tecla do Windows direita | 92 | Meta | MetaRight | event.metaKey é true |
tecla select (menu de contexto) | 93 | ContextMenu | ContextMenu | |
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 | |
multiplicar | 106 | * | NumpadMultiply | |
somar | 107 | + | NumpadAdd | |
subtrair | 109 | - | NumpadSubtract | |
ponto/vírgula decimal | 110 | . | NumpadDecimal | |
dividir | 111 | / | NumpadDivide | |
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 | |
num lock | 144 | NumLock | NumLock | |
scroll lock | 145 | ScrollLock | ScrollLock | |
volume do áudio muto | 173 | AudioVolumeMute | ⚠️ O valor de event.which é 181 no Firefox. O FF fornece o valor do código como VolumeMute | |
baixar volume do áudio | 174 | AudioVolumeDown | ⚠️ O valor de event.which é 182 no Firefox. O FF fornece o valor do código como VolumeDown | |
subir volume do áudio | 175 | AudioVolumeUp | ⚠️ O valor de event.which é 183 no Firefox. O FF fornece o valor do código como VolumeUp | |
media player | 181 | LaunchMediaPlayer | ⚠️ O valor de event.which é 0 (sem valor) no Firefox. O FF fornece o valor do código como MediaSelect | |
executar aplicação 1 | 182 | LaunchApplication1 | ⚠️ O valor de event.which é 0 (sem valor) no Firefox. O FF fornece o valor do código como LaunchApp1 | |
executar aplicação 2 | 183 | LaunchApplication2 | ⚠️ O valor de ️event.which é 0 (sem valor) no Firefox. O FF fornece o valor do código como LaunchApp2 | |
ponto e vírgula | 186 | ; | Semicolon | ⚠️ O valor de event.which é 59 no Firefox |
sinal de igual | 187 | = | Equal | ⚠️ O valor de event.which é 61 no Firefox |
vírgula | 188 | , | Comma | |
travessão | 189 | - | Minus | ⚠️ O valor de event.which é 173 no Firefox |
ponto | 190 | . | Period | |
barra para frente | 191 | / | Slash | |
crase | 192 | ` | Backquote | |
abre colchetes | 219 | [ | BracketLeft | |
barra para trás | 220 | \ | Backslash | |
fecha colchetes | 221 | ] | BracketRight | |
aspa simples | 222 | ' | Quote |
Observe:
event.which
foi descontinuado (ou desatualizado)- O valor de
event.code
é o mesmo para letras minúsculas e maiúsculas. No entanto, o valor deevent.key
representa a letra de fato. - O valor de
event.which
é diferente no Firefox(FF) e em outros navegadores para as teclas:equal(=)
,semicolon(;)
, edash/minus(-)
E quanto ao teclado virtual?
E quanto ao teclado virtual que utilizamos em nosso celular ou tablet ou qualquer outro dispositivo?
As especificações dizem que o teclado virtual possui o mesmo layout e funcionalidade que um teclado padrão. Assim, ele deverá retornar um atributo adequado. Caso contrário, não retornará o valor correto.
Em resumo
Para resumir:
- Você pode utilizar o
KeyboardEvent
para capturar as interações do usuário utilizando um teclado. - Existem três eventos primários:
keydown
,keypress
, ekeyup
. - Devemos utilizar o tipo de evento
keydown
quando possível, pois ele é o suficiente para a maioria dos casos de uso do usuário. - O tipo de evento
keypress
foi descontinuado. - A propriedade
event.which
foi descontinuada. Utilizeevent.key
sempre que possível. - Se tiver que fornecer suporte para um navegador mais antigo, utilize o fallback apropriado para detectar a tecla.
- Podemos combinar várias teclas para realizar operações.
- O teclado virtual possui suporte para estes eventos desde que o layout e as funções sejam similares às de um teclado padrão.
Isto é tudo por agora. Obrigado por ler até aqui! Entre em contato com o autor. Você pode entrar em contato com ele (@tapasadhikary) e fazer comentários ou fique à vontade para segui-lo no Twitter .
