De acordo com o MDN, definitivamente não devemos usar a .keyCode
propriedade. Está obsoleto:
https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode
Na escola W3, esse fato é minimizado e há apenas uma nota lateral dizendo que .keyCode
é fornecido apenas para compatibilidade e que a versão mais recente da Especificação de eventos DOM recomenda o uso da .key
propriedade.
O problema é que .key
não há suporte para navegadores, então o que devemos usar? Tem algo que estou perdendo?
javascript
key
deprecated
keycode
Jason210
fonte
fonte
.key
é compatível com todos os principais navegadores developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/…Respostas:
Você tem três maneiras de lidar com isso, conforme está escrito no link que você compartilhou.
você deve contemplá-los, esse é o caminho certo se você deseja suporte para vários navegadores.
Poderia ser mais fácil se você implementar algo assim.
fonte
Além disso, todos os keyCode , which , charCode e keyIdentifier estão obsoletos:
charCode
ekeyIdentifier
são recursos não padrão.keyIdentifier
é removido a partir do Chrome 54 e o Opera 41.0keyCode
retorna 0, no evento de pressionamento de tecla com caracteres normais no FF.A propriedade principal :
No momento em que este livro foi escrito, a
key
propriedade era suportada por todos os principais navegadores a partir de: Firefox 52, Chrome 55, Safari 10.1, Opera 46. Exceto o Internet Explorer 11 que tem: identificadores de chave não padrão e comportamento incorreto com AltGraph. Mais informaçõesSe isso for importante e / ou a compatibilidade com versões anteriores for, você pode usar a detecção de recurso como no seguinte código:
Observe que o
key
valor é diferente dekeyCode
ouwhich
propriedades porque: ele contém o nome da chave, não seu código. Se o seu programa precisa de códigos de caracteres, você pode fazer uso decharCodeAt()
. Para caracteres únicos imprimíveis, você pode usarcharCodeAt()
, se estiver lidando com chaves cujos valores contenham vários caracteres, como as ArrowUp chances são: você está testando chaves especiais e executa as ações de acordo. Então, tentar implementar uma tabela de valores chaves e seus códigos correspondentescharCodeArr["ArrowUp"]=38
,charCodeArr["Enter"]=13
,charCodeArr[Escape]=27
... e assim por diante, por favor dê uma olhada em valores-chave e seus códigos correspondentesPode ser que você queira considerar a compatibilidade com versões futuras, ou seja, usar as propriedades legadas enquanto estão disponíveis e apenas quando for descartado, mude para as novas:
Veja também: a documentação da
KeyboardEvent.code
propriedade e mais alguns detalhes nesta resposta .fonte
charCodeArr
função não existe. Além disso,charCodeAt
não funciona para todos os valores dee.key
. Por exemplo, para a chaveEnter
/Return
, o valor dae.key
propriedade é"Enter"
, e a execuçãocharCodeArr
dessa string retorna o valor69
(que é o código ASCII do caractereE
).TLDR: Eu sugiro que você deve usar o novo
event.key
eevent.code
propriedades em vez dos legados. O IE e o Edge oferecem suporte a essas propriedades, mas ainda não oferecem suporte aos novos nomes de chave. Para eles, há um pequeno polyfill que os torna a saída dos nomes de chave / código padrão:https://github.com/shvaikalesh/shim-keyboard-event-key
Eu vim para esta pergunta procurando o motivo do mesmo aviso MDN como OP. Depois de pesquisar mais um pouco, o problema com
keyCode
se torna mais claro:O problema do uso
keyCode
é que os teclados que não são em inglês podem produzir saídas diferentes e até mesmo teclados com layouts diferentes podem produzir resultados inconsistentes. Além disso, houve o caso deSe você leu as especificações W3C: https://www.w3.org/TR/uievents/#interface-keyboardevent
Ele descreve em profundidade o que havia de errado com
keyCode
: https://www.w3.org/TR/uievents/#legacy-key-attributesEntão, depois de estabelecer o motivo pelo qual o keyCode legado foi substituído, vamos ver o que você precisa fazer hoje:
key
ecode
).fonte
KeyboardEvent.code
. Além disso, os valores parakey
ecode
dependem do navegador. Ambos os problemas tornamkey
ecode
não são práticos para uso em aplicações da vida real.key
oucode
? Geralmente é uma chave física, mas pode depender do Num Lock e do layout também ... Qual é a prática recomendada?O MDN já forneceu uma solução:
https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode
fonte
key
é um valor de string específico do navegador como"Enter"
ou"ArrowUp"
e não há uma maneira padronizada de convertê-lo no código correspondente. então você vai precisar de ainda mais código clichê para converter entre chave e código.Por exemplo, se você deseja detectar se a tecla "Enter" foi clicada ou não:
Ao invés de
Faça como
fonte