Según MDN, definitivamente no deberíamos usar la .keyCode
propiedad. Está en desuso:
https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode
En la escuela W3, este hecho se minimiza y solo hay una nota al margen que dice que .keyCode
se proporciona solo por compatibilidad y que la última versión de la Especificación de eventos DOM recomienda usar la .key
propiedad en su lugar.
El problema es que .key
no es compatible con los navegadores, entonces, ¿qué deberíamos usar? ¿Se me escapa algo?
javascript
key
deprecated
keycode
Jason210
fuente
fuente
.key
es compatible con todos los principales desarrolladores deRespuestas:
Tiene tres formas de manejarlo, ya que está escrito en el enlace que compartió.
if (event.key !== undefined) { } else if (event.keyIdentifier !== undefined) { } else if (event.keyCode !== undefined) { }
debe contemplarlos, esa es la manera correcta si desea compatibilidad con varios navegadores.
Podría ser más fácil si implementas algo como esto.
var dispatchForCode = function(event, callback) { var code; if (event.key !== undefined) { code = event.key; } else if (event.keyIdentifier !== undefined) { code = event.keyIdentifier; } else if (event.keyCode !== undefined) { code = event.keyCode; } callback(code); };
fuente
Además, todos los keyCode , que , charCode y keyIdentifier están obsoletos:
charCode
ykeyIdentifier
son funciones no estándar.keyIdentifier
se elimina a partir de Chrome 54 y Opera 41.0keyCode
devuelve 0, en caso de pulsación de tecla con caracteres normales en FF.La propiedad clave :
En el momento de escribir este artículo, la
key
propiedad es compatible con todos los navegadores principales a partir de: Firefox 52, Chrome 55, Safari 10.1, Opera 46. Excepto Internet Explorer 11, que tiene: identificadores de clave no estándar y comportamiento incorrecto con AltGraph. Más informaciónSi eso es importante y / o la compatibilidad con versiones anteriores lo es, puede usar la detección de características como en el siguiente código:
Observe que el
key
valor es diferente dekeyCode
owhich
propiedades en que: contiene el nombre de la clave, no su código. Si su programa necesita códigos de caracteres, puede utilizarloscharCodeAt()
. Para caracteres únicos imprimibles que puede usarcharCodeAt()
, si está tratando con claves cuyos valores contienen varios caracteres, como es ArrowUp probable que esté probando claves especiales y tome las medidas correspondientes. A fin de tratar la implementación de una tabla de valores de Keys y sus códigos correspondientescharCodeArr["ArrowUp"]=38
,charCodeArr["Enter"]=13
,charCodeArr[Escape]=27
... y así sucesivamente, por favor miren valores clave y sus códigos correspondientesif(e.key!=undefined){ var characterCode = charCodeArr[e.key] || e.key.charCodeAt(0); }else{ /* As @Leonid suggeted */ var characterCode = e.which || e.charCode || e.keyCode || 0; } /* ... code making use of characterCode variable */
Es posible que desee considerar la compatibilidad con versiones posteriores, es decir, usar las propiedades heredadas mientras estén disponibles, y solo cuando se suelten, cambie a las nuevas:
if(e.which || e.charCode || e.keyCode ){ var characterCode = e.which || e.charCode || e.keyCode; }else if (e.key!=undefined){ var characterCode = charCodeArr[e.key] || e.key.charCodeAt(0); }else{ var characterCode = 0; }
Consulte también: los documentos de
KeyboardEvent.code
propiedad y algunos detalles más en esta respuesta .fuente
charCodeArr
función no existe. Además,charCodeAt
no funciona para todos los valores dee.key
. Por ejemplo, para la teclaEnter
/Return
, el valor dee.key
propiedad es"Enter"
, y la ejecucióncharCodeArr
de esa cadena devuelve el valor69
(que es el código ASCII del carácterE
).TLDR: me gustaría sugerir que usted debe utilizar el nuevo
event.key
yevent.code
propiedades en lugar de los antiguos. IE y Edge admiten estas propiedades, pero todavía no admiten los nuevos nombres de clave. Para ellos, hay un pequeño polyfill que les hace generar los nombres de clave / código estándar:https://github.com/shvaikalesh/shim-keyboard-event-key
Llegué a esta pregunta buscando el motivo de la misma advertencia de MDN que OP. Después de buscar un poco más, el problema con se
keyCode
vuelve más claro:El problema con el uso
keyCode
es que los teclados que no están en inglés pueden producir diferentes salidas e incluso los teclados con diferentes diseños pueden producir resultados inconsistentes. Además, estaba el caso deSi lee las especificaciones de W3C: https://www.w3.org/TR/uievents/#interface-keyboardevent
Se profundiza en la descripción de lo que estaba mal con
keyCode
: https://www.w3.org/TR/uievents/#legacy-key-attributesEntonces, después de establecer la razón por la que se reemplazó el keyCode heredado, veamos lo que debe hacer hoy:
key
ycode
).fuente
KeyboardEvent.code
. Además, los valores dekey
ycode
dependen del navegador. Ambos problemas hacenkey
ycode
no son prácticos para usar en aplicaciones de la vida real.key
ocode
? Por lo general, es una tecla física, pero también puede depender de Num Lock y del diseño ... ¿Cuál es la mejor práctica?MDN ya ha proporcionado una solución:
https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode
window.addEventListener("keydown", function (event) { if (event.defaultPrevented) { return; // Should do nothing if the default action has been cancelled } var handled = false; if (event.key !== undefined) { // Handle the event with KeyboardEvent.key and set handled true. } else if (event.keyIdentifier !== undefined) { // Handle the event with KeyboardEvent.keyIdentifier and set handled true. } else if (event.keyCode !== undefined) { // Handle the event with KeyboardEvent.keyCode and set handled true. } if (handled) { // Suppress "double action" if event handled event.preventDefault(); } }, true);
fuente
key
es un valor de cadena específico del navegador como"Enter"
o"ArrowUp"
y no hay una forma estandarizada de convertirlo en el código correspondiente. por lo que necesitará aún más código repetitivo para convertir entre clave y código.Por ejemplo, si desea detectar si se hizo clic en la tecla "Enter" o no:
En vez de
event.keyCode === 13
Hazlo como
event.key === 'Enter'
fuente