¿Cuál es la diferencia entre estos tres eventos? Al buscar en Google encontré que:
- El
onKeyDown
evento se desencadena cuando el usuario presiona una tecla.- El
onKeyUp
evento se desencadena cuando el usuario suelta una clave.- El
onKeyPress
evento se activa cuando el usuario presiona y suelta una tecla (onKeyDown
seguida deonKeyUp
).
Entiendo los dos primeros, pero ¿no es lo onKeyPress
mismo que onKeyUp
? ¿Es posible liberar una tecla ( onKeyUp
) sin presionarla ( onKeyDown
)?
Esto es un poco confuso, ¿alguien puede aclarar esto por mí?
javascript
dom
dom-events
instantsetsuna
fuente
fuente
Respuestas:
Verifique aquí el enlace archivado utilizado originalmente en esta respuesta.
Desde ese enlace:
fuente
KeyPress
,KeyUp
YKeyDown
son análogos a, respectivamente:Click
,MouseUp,
yMouseDown
.Down
sucede primeroPress
sucede en segundo lugar (cuando se ingresa el texto)Up
sucede en último lugar (cuando se completa la entrada de texto).La excepción es webkit , que tiene un evento adicional allí:
A continuación hay un fragmento que puede usar para ver por sí mismo cuándo se desencadenan los eventos:
fuente
keypress
ykeydown
literalmente se les asigna el mismo.timeStamp
valor, que es preciso a intervalos de 5 microsegundos, pero ese no es realmente mi punto de todos modos. Mi punto es que elclick
evento no se dispara hasta que sueltas el botón del mouse, por lo que decir quekeypress
es la versión del tecladoclick
hace que suene comokeypress
tampoco se disparará hasta que sueltes la tecla. De hecho, ese no es el caso: se dispara cuando se presiona la tecla, al igual que lokeydown
hace. Entonces,keypress
de hecho, no es análogo aclick
nada.keypress
,keyup
ykeydown
son análogos aclick
,mouseup
ymousedown
. La interpretación natural de eso, para mí, es que sekeypress
dispara en el mismo instante quekeyup
(al igual queclick
ymouseup
). Lo que hizo que quiere decir, si no que?La mayoría de las respuestas aquí se centran más en la teoría que en asuntos prácticos y hay algunas grandes diferencias entre
keyup
ykeypress
en lo que respecta a los valores de los campos de entrada, al menos en Firefox (probado en 43).Si el usuario escribe
1
en un elemento de entrada vacío:El valor del elemento de entrada será una cadena vacía (valor anterior) dentro del
keypress
controladorEl valor del elemento de entrada será
1
(nuevo valor) dentro delkeyup
controlador.Esto es de importancia crítica si está haciendo algo que se basa en conocer el nuevo valor después de la entrada en lugar del valor actual, como la validación en línea o la tabulación automática.
Guión:
12345
en un elemento de entrada.12345
.A
.Cuando el
keypress
evento se activa después de ingresar la letraA
, el cuadro de texto ahora contiene solo la letraA
.Pero:
12345
.5
Parece que el navegador (Firefox 43) borra la selección del usuario, luego dispara el
keypress
evento, luego actualiza el contenido de los campos y luego disparakeyup
.fuente
onkeydown
se dispara cuando la tecla está presionada (como en los accesos directos; por ejemplo, enCtrl+A
,Ctrl
se mantiene presionada.onkeyup
se dispara cuando se suelta la tecla (incluidas las teclas modificadoras / etc.)onkeypress
se dispara como una combinación deonkeydown
yonkeyup
, o dependiendo de la repetición del teclado (cuandoonkeyup
no se dispara). (Este comportamiento de repetición es algo que no he probado. ¡Si lo haces, agrega un comentario!)textInput
(solo webkit) se activa cuando se ingresa algún texto (por ejemplo,Shift+A
ingresaría 'A' en mayúsculas, peroCtrl+A
seleccionaría texto y no ingresaría ningún ingreso de texto. En ese caso, se activan todos los demás eventos)fuente
Primero, tienen un significado diferente: disparan:
En segundo lugar, algunas teclas activan algunos de estos eventos y no activan otros . Por ejemplo,
Además, debe tener en cuenta que
event.keyCode
(yevent.which
) generalmente tienen el mismo valor para KeyDown y KeyUp pero diferente para KeyPress. Prueba el patio de recreo que he creado. Por cierto, he notado una peculiaridad: en Chrome, cuando presiono ctrl+ ayinput
/textarea
está vacío, ¡para KeyPress se dispara conevent.keyCode
(yevent.which
) igual a1
! (cuando la entrada no está vacía, no se dispara en absoluto).Finalmente, hay algunas pragmáticas :
textarea
, tanto KeyPress como KeyDown se disparan varias veces (Chrome 71), usaría KeyDown si necesito el evento que se dispara varias veces y KeyUp para liberar una sola tecla.input
s ytextarea
S en diferentes navegadores (sobre todo debido a la pérdida de concentración)He usado los 3 en mi proyecto, pero desafortunadamente puede haber olvidado algo de pragmática. (a tener en cuenta: también hay
input
ychange
eventos)fuente
Este artículo de Jan Wolter es la mejor pieza que he encontrado, puedes encontrar la copia archivada aquí si el enlace está muerto.
Explica todos los eventos clave del navegador realmente bien,
fuente
Parece que onkeypress y onkeydown hacen lo mismo (dentro de la pequeña diferencia de teclas de acceso directo ya mencionadas anteriormente).
Puedes probar esto:
Y verá que los eventos al presionar la tecla y al presionar la tecla se activan mientras se presiona la tecla y no cuando se presiona la tecla.
La diferencia es que el evento se desencadena no una, sino muchas veces (siempre que mantenga presionada la tecla). Tenga en cuenta eso y manejarlos en consecuencia.
fuente
keypress
escriben algo no causan un evento, pero siempre desencadenan unkeydown
.El evento onkeypress funciona para todas las teclas excepto ALT, CTRL, SHIFT, ESC en todos los navegadores donde el evento onkeydown funciona para todas las teclas. Significa que el evento onkeydown captura todas las claves.
fuente
Solo quería compartir una curiosidad:
cuando se usa el evento onkeydown para activar un método JS, ¡el código de acceso para ese evento NO es el mismo que se obtiene con onkeypress!
Por ejemplo, las teclas del teclado numérico devolverán los mismos códigos de caracteres que las teclas numéricas sobre las teclas de letras cuando se usa onkeypress, ¡pero NO cuando se usa onkeydown!
¡Me tomó unos segundos descubrir por qué mi script que verificó ciertos códigos de barras falló al usar onkeydown!
Demostración: https://www.w3schools.com/code/tryit.asp?filename=FMMBXKZLP1MK
y si. Sé que la definición de los métodos es diferente ... pero lo que es muy confuso es que en ambos métodos el resultado del evento se recupera usando event.keyCode ... pero no devuelven el mismo valor ... no es muy Implementación declarativa.
fuente
0123456789
)Básicamente, estos eventos actúan de manera diferente en diferentes tipos y versiones de navegadores, creé una pequeña prueba jsBin y puede consultar la consola para averiguar cómo se comportan estos eventos para su entorno objetivo, espero esta ayuda. http://jsbin.com/zipivadu/10/edit
fuente
Respuesta actualizada:
KeyDown
KeyPress
Tecla Arriba
Este es el comportamiento en ambos
addEventListener
yjQuery
.https://jsbin.com/vebaholamu/1/edit?js,console,output <- prueba ejemplo
(la respuesta ha sido editada con la respuesta correcta, captura de pantalla y ejemplo)
fuente
Algunos datos prácticos que pueden ser útiles para decidir qué evento manejar (ejecute el script a continuación y concéntrese en el cuadro de entrada):
Prensado:
las teclas que no se insertan / escriben (p Shift. ej . Ctrl) no activarán a
keypress
. Presione Ctrly suelte:Las teclas de los teclados que aplican transformaciones de caracteres a otros caracteres pueden conducir a "teclas" muertas y duplicadas (por ejemplo ~, ´) en
keydown
. Presiónelo ´y suéltelo para mostrar un doble´´
:Además, las entradas que no se escriben (por ejemplo, a distancia
<input type="range">
) seguirán activando todos los eventos de pulsación de tecla, pulsación de tecla y pulsación de tecla de acuerdo con las teclas presionadas.fuente