¿Cuál es la diferencia entre estos tres eventos? Al buscar en Google encontré que:
- El
onKeyDownevento se desencadena cuando el usuario presiona una tecla.- El
onKeyUpevento se desencadena cuando el usuario suelta una clave.- El
onKeyPressevento se activa cuando el usuario presiona y suelta una tecla (onKeyDownseguida deonKeyUp).
Entiendo los dos primeros, pero ¿no es lo onKeyPressmismo 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,KeyUpYKeyDownson análogos a, respectivamente:Click,MouseUp,yMouseDown.Downsucede primeroPresssucede en segundo lugar (cuando se ingresa el texto)Upsucede 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
keypressykeydownliteralmente se les asigna el mismo.timeStampvalor, que es preciso a intervalos de 5 microsegundos, pero ese no es realmente mi punto de todos modos. Mi punto es que elclickevento no se dispara hasta que sueltas el botón del mouse, por lo que decir quekeypresses la versión del tecladoclickhace que suene comokeypresstampoco se disparará hasta que sueltes la tecla. De hecho, ese no es el caso: se dispara cuando se presiona la tecla, al igual que lokeydownhace. Entonces,keypressde hecho, no es análogo aclicknada.keypress,keyupykeydownson análogos aclick,mouseupymousedown. La interpretación natural de eso, para mí, es que sekeypressdispara en el mismo instante quekeyup(al igual queclickymouseup). 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
keyupykeypressen lo que respecta a los valores de los campos de entrada, al menos en Firefox (probado en 43).Si el usuario escribe
1en un elemento de entrada vacío:El valor del elemento de entrada será una cadena vacía (valor anterior) dentro del
keypresscontroladorEl valor del elemento de entrada será
1(nuevo valor) dentro delkeyupcontrolador.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:
12345en un elemento de entrada.12345.A.Cuando el
keypressevento se activa después de ingresar la letraA, el cuadro de texto ahora contiene solo la letraA.Pero:
12345.5Parece que el navegador (Firefox 43) borra la selección del usuario, luego dispara el
keypressevento, luego actualiza el contenido de los campos y luego disparakeyup.fuente
onkeydownse dispara cuando la tecla está presionada (como en los accesos directos; por ejemplo, enCtrl+A,Ctrlse mantiene presionada.onkeyupse dispara cuando se suelta la tecla (incluidas las teclas modificadoras / etc.)onkeypressse dispara como una combinación deonkeydownyonkeyup, o dependiendo de la repetición del teclado (cuandoonkeyupno 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+Aingresaría 'A' en mayúsculas, peroCtrl+Aseleccionarí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/textareaestá 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.inputs ytextareaS 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
inputychangeeventos)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
keypressescriben 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
addEventListeneryjQuery.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