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 .keyCodeo .whichpara 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 .whichlugar 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
keyCodeywhichse 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 compatibilidadkeyse 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
whichya que jQuery estandariza las cosas ; Más aquí.Si no está utilizando jQuery, puede hacer esto:
O alternativamente:
... que maneja la posibilidad que
e.whichpodría ser0(al restaurar eso0al final, usando el||operador curiosamente poderoso de JavaScript ).fuente
var key = event.which || event.keyCode;Eso loevent.whichusaréevent.keyCodesiwhichestá 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.whiches 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)whiches proporcionadokeypresspor 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 .whichpropiedad 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 unawhichpropiedad de cero y la mismakeyCodepropiedad quekeydown. La tecla Inicio tiene unkeyCode36 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.whichen función de sievent.which,event.keyCodeoevent.charCodeestá soportado por el navegador:Un beneficio adicional de
.whichjQuery es que también lo hace para los clics del mouse:fuente
var key = event.which || event.charCode || event.keyCodeevent.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
keylugar decode. Por ejemplo, si tiene un teclado con teclas de control de medios, al presionar Reproducir / Pausa sale "MediaPlayPause" parakeyy "" 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.keyactualmente. Documentos de MDN: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyevent.KeyCodeyevent.whichambos 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.keyparece implementarse de manera idéntica en todos los navegadores. Para las teclas de control (tab, enter, escape, etc.),event.keytiene 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.codese 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,deleteyf1a 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