Também disponível em: English · Español · Français · العربية
Testador de códigos de tecla
Mostra todos os campos que um evento keydown transporta e explica quais é que a norma define mesmo.
O que é um testador de códigos de tecla?
Quando carrega numa tecla, o navegador dispara um evento keydown que transporta várias propriedades a descrever a mesma pulsação de maneiras diferentes. Um testador mostra-lhe o que essas propriedades contêm de facto, que é a forma mais rápida de saber o que verificar no seu código — e a única de ter a certeza, porque a resposta depende do navegador, do sistema operativo e da disposição de teclado que tem à frente.
As três que interessam são key, code e keyCode. O code nomeia a tecla física pelo sítio onde ela se senta num teclado americano nocional: a tecla ao lado do Shift esquerdo é KeyZ, quer a letra impressa seja Z, Y ou W. O key é o que aquela pulsação produziu: o caractere em si, ou um nome como ArrowLeft ou Escape quando não há caractere nenhum. E o keyCode é um número herdado de um desenho muito mais antigo que os navegadores continuam a enviar.
A demonstração está em cima e faz-se com uma mão. Carregue na tecla 1: key é «1», code é Digit1, keyCode é 49. Agora mantenha o Shift e carregue outra vez: o code continua Digit1, o keyCode continua 49, e o key passou a «!». Dois caracteres diferentes, uma tecla física, e um número incapaz de os distinguir.
Como usar
- Clique na caixa e carregue numa tecla. A caixa só escuta enquanto tem o foco, portanto nada é capturado nas suas costas. Todos os campos do evento aparecem de imediato, e por baixo ficam guardadas as últimas oito pulsações para poder comparar duas seguidas.
- Experimente um par que difira por um modificador. 1 e Shift+1, ou a tecla do ponto e vírgula com e sem Shift. Repare no key a mudar enquanto o code e o keyCode ficam quietos: é essa toda a distinção, visível num único teclado.
- Procure um código nas tabelas em baixo. As duas tabelas são as da própria norma. Procure por nome ou por número; os códigos que a norma lista com dois caracteres diferentes vão assinalados, porque são precisamente aqueles que o keyCode não consegue resolver.
O keyCode nunca foi norma, e a norma di-lo
Costuma dizer-se que o keyCode está obsoleto. Não foi bem isso que aconteceu, e o que aconteceu é mais interessante. A secção 7 da especificação UI Events, onde estas propriedades são descritas, está marcada como não normativa e diz delas que «nunca foram formalmente especificadas e as implementações atuais dos navegadores variam de formas significativas». A especificação «não define normativamente» nenhuma delas. Estão escritas apenas para que fique registado algures aquilo que os navegadores já fazem.
A razão apresentada é que já é tarde para corrigir. Formalizar os atributos herdados «arriscaria partir tanto conteúdo quanto o que corrigiria ou permitiria», porque há imenso código que deteta o navegador e age em conformidade. A especificação acrescenta que estes atributos «não são adequados a uso internacional, nem respondem a preocupações de acessibilidade», e que se deve usar o key em vez deles.
Depois faz uma coisa pouco habitual: publica duas tabelas a descrever aquilo em que os navegadores coincidem, e separa-as consoante o quanto está disposta a afirmar. Uma lista os códigos que «não costumam mudar com a disposição do teclado em sistemas de secretária» — repare em «costumam», que é a palavra da própria norma. A outra lista pontuação que «PODE mudar de código entre disposições», onde os navegadores dão o número do teclado americano porque o código antigo o espera.
A segunda tabela contém a prova mais forte desta página, e não é preciso carregar em nada. Onze dos seus códigos aparecem duas vezes: uma para o caractere sem Shift e outra para o caractere com Shift. O 186 é ao mesmo tempo o ponto e vírgula e os dois pontos. O 187 é ao mesmo tempo o igual e o mais. O 222 são ao mesmo tempo a plica e as aspas. A ambiguidade não é um defeito de um navegador nem um caso raro: está impressa na norma.
Limites honestos
Esta página só lhe consegue dizer o que o seu navegador, no seu sistema operativo, com a sua disposição de teclado atual, envia neste momento. Isso é genuinamente útil — é a máquina onde está a depurar — mas não é uma resposta geral. Se precisa de saber o que um teclado AZERTY francês envia para uma tecla física concreta, nenhum testador a correr na sua máquina lho pode dizer: o valor do code é definido contra uma disposição americana nocional exatamente para não variar, e tudo o resto varia.
A caixa só escuta enquanto tem o foco, e isso é deliberado e não uma limitação. Uma página que captura todas as pulsações aconteça o que acontecer é desagradável e parte os atalhos do próprio navegador. Pela mesma razão o tabulador não é capturado a não ser que o peça: carregar no tabulador é como se sai da caixa com o teclado, e prendê-lo em silêncio deixaria alguém encurralado.
Há teclas que uma página web não consegue capturar de todo, faça o que fizer. O navegador e o sistema operativo ficam com uma camada antes, portanto uma combinação atribuída a fechar uma janela, mudar de aplicação ou abrir um menu do sistema nunca chega à página. Não é coisa que um testador possa contornar, e qualquer página que afirme o contrário está a testar outra coisa.
As teclas mortas vale a pena conhecê-las se escreve uma língua com acentos. Em muitas disposições uma tecla de acento não produz caractere nenhum sozinha — altera o seguinte — e o navegador reporta o key como «Dead». O testador identifica-as em vez de mostrar um valor vazio, porque um campo key vazio parece um defeito quando é a resposta certa.
Por fim, as tabelas aqui são as da norma, não um censo de tudo o que um navegador pode enviar. A maioria dos códigos não aparece em nenhuma delas, e a página di-lo em vez de inventar um estado: a norma descreve só os valores em que viu os navegadores coincidir.
Porque é grátis
Porque não custa nada manter. Tudo acontece no seu navegador: as pulsações são lidas e mostradas localmente, nada é enviado para lado nenhum e não há conta.
As tabelas são extraídas da especificação por um guião guardado no repositório, e os testes voltam a extraí-las e comparam, portanto um desvio entre o que esta página mostra e o que a norma imprime parte a compilação em vez de chegar até si. A gralha que a própria norma tem no nome de uma tecla é conservada de propósito, como prova de que a tabela foi lida e não copiada de memória.