2012-06-14 10 views
36

relacionadas: JavaScript KeyCode vs CharCodetecla y teclados: ¿por qué el código de tecla es diferente?

Aquí hay un código que puede probar en casa o en un jsfiddle:

el.addEventListener('keyup', function(e) { 
    console.log('Keyup event'); 
    console.log(e.keyCode); 
}); 
el.addEventListener('keypress', function(e) { 
    console.log('Keypress event'); 
    console.log(e.keyCode); 
}); 

¿Por qué es el código clave diferente?

Entiendo por qué uno debe usar la tecla presionar solamente, pero lo que no entiendo es cómo dos eventos clave, dados la misma tecla de golpe en el teclado, dan diferentes códigos de tecla.

PD: No me preocupo por el soporte de navegadores antiguos, probé esto en Chrome y me sorprendió y no pude encontrar una explicación.

+0

La pregunta [onKeyPress vs. onKeyUp y onKeyDown] (http://stackoverflow.com/questions/3396754/onkeypress-vs-onkeyup-and-onkeydown) está relacionado de alguna manera y también puede ser una lectura interesante. –

Respuesta

42

Los eventos son para fines completamente diferentes. Use keyup y keydown para identificar las claves físicas y keypress para identificar los caracteres escritos. Las dos son tareas fundamentalmente diferentes con diferentes eventos; no intentes mezclar los dos. En particular, keyCode en keypress eventos suele ser redundante y no debe utilizarse (excepto en el IE más antiguo, pero consulte el documento vinculado a continuación para obtener más información al respecto); para las pulsaciones de teclas imprimibles, generalmente es lo mismo que which y charCode, aunque hay alguna variación entre los navegadores.

Jan Wolter's article on key events, ya enlazado en en otra respuesta, es la palabra definitiva sobre este tema para mí y tiene tablas que describen qué devuelve cada una de las diferentes propiedades para cada tipo de evento clave y cada navegador.

+5

Entiendo que los propósitos son diferentes, no responde al hecho de que el código de clave es diferente, aunque las * claves * sean las mismas. –

+0

@FlorianMargaine: hay tablas en la página de Jan Wolter que muestran lo que devuelve cada propiedad para cada evento.Para WebKit (y de hecho la mayoría de los navegadores ahora), 'keyCode' devuelve lo mismo que' which' y 'charCode' para' keypress' events, que es el código de carácter correspondiente al carácter escrito, a diferencia del código de tecla de la tecla presionado (como está en 'keyup' y' keydown'). –

+1

Tuve que leer detenidamente el artículo para esta parte: 'En los eventos de keydown y keyup, los códigos de tecla no son códigos de caracteres, y esta conversión dará resultados salvajes para muchas teclas. No hay una forma general portátil de convertir los códigos clave en caracteres. Tienes que sentir el tipo de navegador y basar la asignación de teclas en eso. No tengo información sobre códigos de tecla enviados por teclados internacionales. :) ¡Gracias por su respuesta, por cierto! –

2

Hay un good article on quirksmode.org respondiendo exactamente esa pregunta. También es posible que desee mirar Unixpapa's results.

+0

quirksmode dice especialmente: 'por ejemplo, una minúscula 'a' y una mayúscula 'A' tienen el mismo código de clave', por lo que no entiendo. ¿Hay algo que eché de menos? El segundo artículo está vinculado en la pregunta relacionada :) –

+1

Son la misma tecla en su teclado, solo con diferentes modificadores (turno). Keyup/down es para las teclas presionadas para el texto escrito. – Bergi

+0

Entonces deberían dar el mismo código de clave. ¿Por qué no dependen del evento? –

0

Bueno, me encontré con una diferencia cuando estaba tratando de copiar la entrada del usuario de una entrada del formulario a otra parte del formulario, que había bloqueado para que los usuarios puedan editar. Lo que encontré fue que cada vez que un usuario pasaba a la siguiente etiqueta con la tecla al completar la entrada, se perdía una última entrada del teclado en la entrada copiada cuando utilizaba eventListener para presionar teclas y esto se resolvió al usar la tecla.

Así que, en conclusión Keypress escucha el estado en el instante en que se pulsa la tecla, dejando a un lado el resultado de la pulsación de tecla, mientras que keyup escucha el estado del sistema después de que la clave ha sido presionado y incluye el resultado de la tecla presionar

Cuestiones relacionadas