Pensé que esto sería respondido en algún lugar en Stack Overflow, pero no puedo encontrarlo.
Si estoy escuchando un evento de pulsación de tecla, ¿debería usar .keyCode
o .which
para determinar si se presionó la tecla Intro?
Siempre he hecho algo como lo siguiente:
$("#someid").keypress(function(e) {
if (e.keyCode === 13) {
e.preventDefault();
// do something
}
});
Pero estoy viendo ejemplos que usan en .which
lugar de .keyCode
. ¿Cual es la diferencia? ¿Es uno más compatible con todos los navegadores que el otro?
javascript
jquery
ScottE
fuente
fuente
Respuestas:
Nota: a continuación La respuesta fue escrito en 2010. Aquí, muchos años después, tanto
keyCode
ywhich
se está desfasada y enkey
(para la clave lógica) ycode
(para la ubicación física de la llave). Pero tenga en cuenta que IE no es compatiblecode
, y su compatibilidadkey
se basa en una versión anterior de la especificación, por lo que no es del todo correcto. Mientras escribo esto, el Edge actual basado en EdgeHTML y Chakra tampoco es compatiblecode
, pero Microsoft está implementando su reemplazo basado en Blink y V8 para Edge, que presumiblemente sí lo hará / lo hará.Algunos navegadores usan
keyCode
, otros usanwhich
.Si está utilizando jQuery, puede utilizarlo de manera confiable
which
ya que jQuery estandariza las cosas ; Más aquí.Si no está utilizando jQuery, puede hacer esto:
O alternativamente:
... que maneja la posibilidad que
e.which
podría ser0
(al restaurar eso0
al final, usando el||
operador curiosamente poderoso de JavaScript ).fuente
var key = event.which || event.keyCode;
Eso loevent.which
usaréevent.keyCode
siwhich
está definido y no es falso, o si no está definido o es falso. Técnicamente, probablemente debería hacer,var key = typeof event.which === "undefined" ? event.keyCode : event.which;
pero sievent.which
es así0
(¿puede ser0
?), Es poco probable que me importe el tipo de cosas que hago.which
, que creo que solo es proporcionado por jQuery, pero no estoy 100% seguro, pero debería ayudarlo a comenzar a ver diferencias en los navegadores)which
es proporcionadokeypress
por todos los navegadores, excepto IE. Y quirksmode no tiene autoridad aquí. Como referencia, el enlace que publicó @TJ Crowder es mucho mejor: unixpapa.com/js/key.html .which
propiedad del evento puede ser cero, y esto puede hacer una gran diferencia en la mayoría de las aplicaciones. Por ejemplo, las claves no imprimibles en Firefox tienen unawhich
propiedad de cero y la mismakeyCode
propiedad quekeydown
. La tecla Inicio tiene unkeyCode
36 en mi PC en Firefox, que es el código de caracteres para "$", lo que haría imposible distinguir entre el usuario que presiona la tecla Inicio y el usuario que escribe un carácter $ usandoevent.which || event.keyCode
.jQuery normaliza
event.which
en función de sievent.which
,event.keyCode
oevent.charCode
está soportado por el navegador:Un beneficio adicional de
.which
jQuery es que también lo hace para los clics del mouse:fuente
var key = event.which || event.charCode || event.keyCode
event.wich == null && ...
prueba solo para nulo o indefinido. suevent.wich || ...
prueba de falsedad (indefinido, nulo, falso, 0 '', etc.)0
. Y no creo que verifique""
o[]
duela.Si permanece en Javascript vainilla, tenga en cuenta que keyCode ahora está en desuso y se eliminará:
https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode
En su lugar, use: .key o .code según el comportamiento que desee: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code https://developer.mozilla.org/en -US / docs / Web / API / KeyboardEvent / key
Ambos se implementan en navegadores modernos.
fuente
key
lugar decode
. Por ejemplo, si tiene un teclado con teclas de control de medios, al presionar Reproducir / Pausa sale "MediaPlayPause" parakey
y "" paracode
.mira esto: https://developer.mozilla.org/en-US/docs/Web/API/event.keyCode
En un evento de pulsación de tecla, el valor Unicode de la tecla presionada se almacena en la propiedad keyCode o charCode, nunca en ambas. Si la tecla presionada genera un carácter (por ejemplo, 'a'), charCode se establece en el código de ese carácter, respetando la letra mayúscula. (es decir, charCode tiene en cuenta si la tecla Mayús se mantiene presionada). De lo contrario, el código de la tecla presionada se almacena en keyCode. keyCode siempre se establece en los eventos keydown y keyup. En estos casos, charCode nunca se establece. Para obtener el código de la clave independientemente de si se almacenó en keyCode o charCode, consulte qué propiedad. Los caracteres ingresados a través de un IME no se registran a través de keyCode o charCode.
fuente
Lo recomendaría
event.key
actualmente. Documentos de MDN: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyevent.KeyCode
yevent.which
ambos tienen advertencias desaprobadas desagradables en la parte superior de sus 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 las claves alfanuméricas,
event.key
parece implementarse de manera idéntica en todos los navegadores. Para las teclas de control (tab, enter, escape, etc.),event.key
tiene el mismo valor en Chrome / FF / Safari / Opera pero un valor diferente en IE10 / 11 / Edge (los IE aparentemente usan una versión anterior de la especificación pero coinciden entre sí como del 14 de enero de 2018).Para las teclas alfanuméricas, un cheque se vería así:
Para los personajes de control, deberías hacer algo como:
Utilicé el ejemplo aquí para probar en varios navegadores (tuve que abrir en codepen y editar para que funcione con IE10): https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/ código
event.code
se menciona en una respuesta diferente como una posibilidad, pero IE10 / 11 / Edge no lo implementa, por lo que está disponible si desea soporte de IE.fuente
Una robusta biblioteca Javascript para capturar la entrada del teclado y las combinaciones de teclas ingresadas. No tiene dependencias.
http://jaywcjlove.github.io/hotkeys/
teclas de acceso rápido comprende los siguientes modificadores:
⇧
,shift
,option
,⌥
,alt
,ctrl
,control
,command
, y⌘
.Las siguientes teclas especiales se pueden utilizar para los accesos directos:
backspace
,tab
,clear
,enter
,return
,esc
,escape
,space
,up
,down
,left
,right
,home
,end
,pageup
,pagedown
,del
,delete
yf1
a travésf19
.fuente
event.keyCode
.En Firefox, la propiedad keyCode no funciona en el evento onkeypress (solo devolverá 0). Para una solución de navegador cruzado, use la propiedad which junto con keyCode, por ejemplo:
fuente