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.
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 .