Qual é a diferença entre esses três eventos? Ao pesquisar no Google, descobri que:
- O
onKeyDown
evento é acionado quando o usuário pressiona uma tecla.- O
onKeyUp
evento é acionado quando o usuário libera uma chave.- O
onKeyPress
evento é acionado quando o usuário pressiona e libera uma tecla (onKeyDown
seguida poronKeyUp
).
Eu entendo os dois primeiros, mas não é onKeyPress
o mesmo que onKeyUp
? É possível soltar uma tecla ( onKeyUp
) sem pressioná-la ( onKeyDown
)?
Isso é um pouco confuso, alguém pode esclarecer isso para mim?
javascript
dom
dom-events
instantsetsuna
fonte
fonte
Respostas:
Verifique aqui o link arquivado usado originalmente nesta resposta.
Nesse link:
fonte
KeyPress
,KeyUp
EKeyDown
são análogos aos, respectivamente:Click
,MouseUp,
eMouseDown
.Down
acontece primeiroPress
acontece em segundo lugar (quando o texto é inserido)Up
acontece por último (quando a entrada de texto estiver concluída).A exceção é o webkit , que possui um evento extra:
Abaixo está um trecho que você pode usar para ver quando os eventos são acionados:
fonte
keypress
ekeydown
recebem literalmente o mesmo.timeStamp
valor, que é preciso em intervalos de 5 microssegundos, mas esse não é realmente o meu ponto. O queclick
quero dizer é que o evento não é acionado até você soltar o botão do mouse, por isso dizer quekeypress
é a versão do tecladoclick
faz parecer quekeypress
também não será acionado até você soltar a tecla. De fato, esse não é o caso: ele dispara quando a tecla é pressionada, assim comokeydown
acontece. Portanto,keypress
não é de fato análogo aclick
isso.keypress
,keyup
ekeydown
são análogos aclick
,mouseup
emousedown
. A interpretação natural disso, para mim, é quekeypress
dispara no mesmo instante quekeyup
(assim comoclick
emouseup
). Como assim , senão isso?A maioria das respostas aqui está focada mais na teoria do que em questões práticas e há algumas grandes diferenças entre
keyup
ekeypress
no que diz respeito aos valores de campo de entrada, pelo menos no Firefox (testado em 43).Se o usuário digitar
1
um elemento de entrada vazio:O valor do elemento de entrada será uma sequência vazia (valor antigo) dentro do
keypress
manipuladorO valor do elemento de entrada será
1
(novo valor) dentro dokeyup
manipulador.Isso é de importância crítica se você estiver fazendo algo que depende de conhecer o novo valor após a entrada e não o valor atual, como validação em linha ou tabulação automática.
Cenário:
12345
em um elemento de entrada.12345
.A
.Quando o
keypress
evento é acionado após a inserção da letraA
, a caixa de texto agora contém apenas a letraA
.Mas:
12345
.5
Assim, parece que o navegador (Firefox 43) apaga a seleção do usuário, em seguida, dispara o
keypress
evento, em seguida, atualiza o conteúdo campos, então incêndioskeyup
.fonte
onkeydown
é acionado quando a tecla é pressionada (como nos atalhos; por exemplo, emCtrl+A
,Ctrl
é mantida 'pressionada'.onkeyup
é acionado quando a chave é liberada (incluindo chaves modificadoras / etc)onkeypress
é acionado como uma combinação deonkeydown
eonkeyup
, ou dependendo da repetição do teclado (quandoonkeyup
não é acionado). (esse comportamento repetido é algo que eu não testei. Se você testar, adicione um comentário!)textInput
(somente kit da web) é acionado quando algum texto é inserido (por exemplo,Shift+A
insere maiúsculas 'A', masCtrl+A
seleciona texto e não insere nenhuma entrada de texto. Nesse caso, todos os outros eventos são acionados)fonte
Primeiro, eles têm um significado diferente: eles disparam:
Segundo, algumas teclas acionam alguns desses eventos e outros não . Por exemplo,
Além disso, lembre-se de que
event.keyCode
(eevent.which
) geralmente têm o mesmo valor para KeyDown e KeyUp, mas um valor diferente para o KeyPress. Experimente o playground que eu criei. A propósito, notei uma peculiaridade: no Chrome, quando pressiono ctrl+ aeinput
/ /textarea
está vazio, o KeyPress é acionado comevent.keyCode
(eevent.which
) igual a1
! (quando a entrada não está vazia, não é acionada).Finalmente, há algumas pragmáticas :
textarea
, o KeyPress e o KeyDown são acionados várias vezes (Chrome 71), eu usaria o KeyDown se precisar do evento que é acionado várias vezes e o KeyUp para liberação de chave única.input
s etextarea
s em diferentes navegadores (principalmente devido à perda de foco)Eu usei os três no meu projeto, mas infelizmente posso ter esquecido algumas das pragmáticas. (de notar: há também
input
echange
eventos)fonte
Este artigo de Jan Wolter é a melhor peça que encontrei, você pode encontrar a cópia arquivada aqui se o link estiver inoperante.
Explica muito bem todos os principais eventos do navegador,
fonte
Parece que onkeypress e onkeydown fazem o mesmo (com a pequena diferença de teclas de atalho já mencionadas acima).
Você pode tentar isso:
E você verá que os eventos onkeypress e onkeydown são acionados enquanto a tecla é pressionada e não quando a tecla é pressionada.
A diferença é que o evento é disparado não uma vez, mas muitas vezes (desde que você mantenha a tecla pressionada). Esteja ciente disso e lide com eles de acordo.
fonte
keypress
evento, mas sempre acionam akeydown
.O evento onkeypress funciona para todas as chaves, exceto ALT, CTRL, SHIFT, ESC em todos os navegadores, enquanto o evento onkeydown funciona para todas as chaves. Significa que o evento onkeydown captura todas as chaves.
fonte
Só queria compartilhar uma curiosidade:
ao usar o evento onkeydown para ativar um método JS, o código para esse evento NÃO é o mesmo que você obtém com o onkeypress!
Por exemplo, as teclas do teclado numérico retornam os mesmos códigos de código que as teclas numéricas acima das teclas de letras ao usar a tecla onkeypress, mas NÃO ao usar a tecla onkeydown!
Demorei alguns segundos para descobrir por que meu script, que verificava determinados códigos, falhou ao usar onkeydown!
Demonstração: https://www.w3schools.com/code/tryit.asp?filename=FMMBXKZLP1MK
e sim. Eu sei que a definição dos métodos é diferente .. mas o que é muito confuso é que em ambos os métodos o resultado do evento é recuperado usando event.keyCode .. mas eles não retornam o mesmo valor .. não é muito implementação declarativa.
fonte
0123456789
)Basicamente, esses eventos agem de maneira diferente em diferentes tipos e versões de navegadores. Criei um pequeno teste jsBin e você pode verificar o console para descobrir como esses eventos se comportam no seu ambiente de destino, espero que ajude. http://jsbin.com/zipivadu/10/edit
fonte
Resposta atualizada:
KeyDown
Pressione o botão
KeyUp
Este é o comportamento em ambos
addEventListener
ejQuery
.https://jsbin.com/vebaholamu/1/edit?js,console,output <- tente exemplo
(a resposta foi editada com a resposta correta, captura de tela e exemplo)
fonte
Alguns fatos práticos que podem ser úteis para decidir qual evento manipular (execute o script abaixo e foque na caixa de entrada):
Pressionando:
chaves não inserção / tipagem (por exemplo Shift, Ctrl) não irá desencadear uma
keypress
. Pressione Ctrle solte-o:teclas de teclados que aplicam transformações de caracteres a outros caracteres podem levar a Dead e duplicar "teclas" (por exemplo ~, ´) ativadas
keydown
. Pressione ´e solte-o para exibir um duplo´´
:Além disso, as entradas sem digitação (por exemplo, à distância
<input type="range">
) ainda acionarão todos os eventos de digitação , pressionamento de tecla e pressionamento de tecla de acordo com as teclas pressionadas.fonte