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 keyupExperimente 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 teclashiftpois 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
keydowntem uma cobertura máxima de contextualização de informação. O eventokeypressfunciona 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+Tabe assim por diante. - Além disso, o evento
keypressjá não deve mais ser utilizado. Isto é o suficiente para evitá-lo. - Embora os eventos
keydownekeyuptratem de todas as teclas e muitos navegadores oferecem suporte a eles, existem algumas diferenças que deixam okeydowna 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.whichfoi descontinuado (ou desatualizado)- O valor de
event.codeé o mesmo para letras minúsculas e maiúsculas. No entanto, o valor deevent.keyrepresenta 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
KeyboardEventpara 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
keydownquando possível, pois ele é o suficiente para a maioria dos casos de uso do usuário. - O tipo de evento
keypressfoi descontinuado. - A propriedade
event.whichfoi descontinuada. Utilizeevent.keysempre 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 .
