Eu pensei que isso seria respondido em algum lugar no Stack Overflow, mas não consigo encontrá-lo.
Se estou ouvindo um evento de pressionamento de tecla, devo usar .keyCode
ou .which
para determinar se a tecla Enter foi pressionada?
Eu sempre fiz algo como o seguinte:
$("#someid").keypress(function(e) {
if (e.keyCode === 13) {
e.preventDefault();
// do something
}
});
Mas estou vendo exemplos que usam em .which
vez de .keyCode
. Qual é a diferença? Um é mais compatível com vários navegadores que o outro?
javascript
jquery
ScottE
fonte
fonte
Respostas:
Nota: A resposta abaixo foi escrito em 2010. Aqui, muitos anos depois, ambos
keyCode
ewhich
são preteridos em favor dekey
(para a chave lógico) ecode
(para a colocação física da chave). Mas observe que o IE não suportacode
, e seu suportekey
é baseado em uma versão mais antiga da especificação, portanto, não é bem correto. Enquanto escrevo isso, o Edge atual baseado no EdgeHTML e no Chakra também não é compatívelcode
, mas a Microsoft está lançando seu substituto para o Edge, baseado em Blink e V8 , que provavelmente é necessário.Alguns navegadores usam
keyCode
, outros usamwhich
.Se você estiver usando jQuery, poderá usá-lo com segurança,
which
pois o jQuery padroniza as coisas ; Mais aqui.Se você não estiver usando jQuery, poderá fazer o seguinte:
Ou alternativamente:
... que lida com a possibilidade que
e.which
possa existir0
(restaurando isso0
no final, usando o||
operador curiosamente poderoso do JavaScript ).fonte
var key = event.which || event.keyCode;
Isso será usadoevent.which
se for definido e não como falsey, ouevent.keyCode
sewhich
for indefinido ou falsey. Tecnicamente eu provavelmente deveria fazer,var key = typeof event.which === "undefined" ? event.keyCode : event.which;
mas seevent.which
for0
(pode ser0
?), É improvável que eu me importe com o tipo de coisa que faço.which
, o que eu acho que é fornecido apenas pelo jQuery, mas não tenho 100% de certeza, mas você deve começar a ver diferenças nos navegadores)which
é fornecidokeypress
por todos os navegadores, exceto o IE. E o modo quirks não é autorizado aqui. Como referência, o link que a @TJ Crowder postou é muito melhor: unixpapa.com/js/key.html .which
propriedade do evento pode ser zero, e isso pode fazer uma grande diferença para a maioria dos aplicativos. Por exemplo, chaves não imprimíveis no Firefox têm umawhich
propriedade zero e a mesmakeyCode
propriedade quekeydown
. A tecla Home possui umkeyCode
de 36 no meu PC no Firefox, que é o código de caractere para "$", o que tornaria impossível distinguir entre o usuário pressionando a tecla Home e o usuário digitando um caractere $ usandoevent.which || event.keyCode
.jQuery normaliza
event.which
dependendo seevent.which
,event.keyCode
ouevent.charCode
é suportado pelo navegador:Um benefício adicional
.which
é que o jQuery também faz isso por cliques do mouse:fonte
var key = event.which || event.charCode || event.keyCode
event.wich == null && ...
teste apenas para nulo ou indefinido. seuevent.wich || ...
teste de falsidade (indefinido, nulo, falso, 0, '' etc.)0
. E eu não acho que procurar""
ou[]
machucar.Se você estiver em Javascript baunilha, observe que o keyCode agora está obsoleto e será descartado:
https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode
Em vez disso, use: .key ou .code, dependendo do comportamento desejado: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code https://developer.mozilla.org/en -US / docs / Web / API / KeyboardEvent / key
Ambos são implementados em navegadores modernos.
fonte
key
vez decode
. Por exemplo, se você possui um teclado com teclas de controle de mídia, pressionar Reproduzir / Pausar gera "MediaPlayPause" parakey
e "" paracode
.veja isso: https://developer.mozilla.org/en-US/docs/Web/API/event.keyCode
Em um evento de pressionamento de tecla, o valor Unicode da tecla pressionada é armazenado na propriedade keyCode ou charCode, nunca em ambas. Se a tecla pressionada gerar um caractere (por exemplo, 'a'), charCode será definido como o código desse caractere, respeitando a letra maiúscula. (ou seja, charCode leva em consideração se a tecla Shift é pressionada). Caso contrário, o código da tecla pressionada é armazenado em keyCode. keyCode é sempre definido nos eventos keydown e keyup. Nesses casos, o charCode nunca é definido. Para obter o código da chave, independentemente de ela estar armazenada em keyCode ou charCode, consulte a propriedade. Os caracteres inseridos por meio de um IME não são registrados por keyCode ou charCode.
fonte
Eu recomendo
event.key
atualmente. Documentos MDN: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyevent.KeyCode
eevent.which
ambos têm avisos desaprovados desagradáveis no topo de suas páginas MDN:https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode https://developer.mozilla.org/en-US / docs / Web / API / KeyboardEvent / which
Para chaves alfanuméricas,
event.key
parece ser implementado de forma idêntica em todos os navegadores. Para chaves de controle (tab, enter, escape, etc),event.key
tem o mesmo valor no Chrome / FF / Safari / Opera, mas um valor diferente no IE10 / 11 / Edge (os IEs aparentemente usam uma versão mais antiga da especificação, mas se combinam como de 14 de janeiro de 2018).Para chaves alfanuméricas, uma verificação seria algo como:
Para caracteres de controle, você precisa fazer algo como:
Usei o exemplo aqui para testar em vários navegadores (tive que abrir no codepen e editar para que ele funcionasse com o IE10): https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/ código
event.code
é mencionado em uma resposta diferente como uma possibilidade, mas o IE10 / 11 / Edge não a implementa; portanto, está fora se você deseja suporte ao IE.fonte
Uma robusta biblioteca Javascript para capturar a entrada do teclado e as combinações de teclas inseridas. Não possui dependências.
http://jaywcjlove.github.io/hotkeys/
teclas compreende os seguintes modificadores de:
⇧
,shift
,option
,⌥
,alt
,ctrl
,control
,command
, e⌘
.As seguintes teclas especiais podem ser usados para atalhos:
backspace
,tab
,clear
,enter
,return
,esc
,escape
,space
,up
,down
,left
,right
,home
,end
,pageup
,pagedown
,del
,delete
ef1
atravésf19
.fonte
event.keyCode
.No Firefox, a propriedade keyCode não funciona no evento onkeypress (retornará apenas 0). Para uma solução entre navegadores, use a propriedade which juntamente com keyCode, por exemplo:
fonte