Selon MDN, nous devrions très certainement ne pas utiliser la propriété .keyCode. Il est déconseillé:
https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode
Sur l'école W3, ce fait est minimisé et il n'y a qu'une note de côté indiquant que .keyCode
Est fourni uniquement à des fins de compatibilité et que la dernière version de la spécification des événements DOM recommande d'utiliser la propriété .key
À la place. .
Le problème est que .key
N'est pas supporté par les navigateurs, alors que devrions-nous utiliser? Y a-t-il quelque chose qui me manque?
Vous avez trois façons de le gérer, comme il est écrit sur le lien que vous avez partagé.
if (event.key !== undefined) {
} else if (event.keyIdentifier !== undefined) {
} else if (event.keyCode !== undefined) {
}
vous devriez les envisager, c’est la bonne manière si vous souhaitez une prise en charge croisée des navigateurs.
Cela pourrait être plus facile si vous implémentez quelque chose comme ça.
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);
};
En outre, tous les keyCode , qui , charCode et keyIdentifier sont obsolètes :charCode
et keyIdentifier
sont des fonctionnalités non standard.keyIdentifier
est supprimé à partir de Chrome 54 et Opera 41.0keyCode
renvoie 0, lors de l'événement de frappe avec des caractères normaux sur FF.
readonly attribute DOMString key
Contient une valeur d'attribut de clé correspondant à la touche appuyée
Au moment de la rédaction de ce document, la propriété key
est prise en charge par tous les principaux navigateurs à partir de: Firefox 52, Chrome 55, Safari 10.1, Opera 46. Sauf Internet Explorer 11, qui a: identificateurs de clé non standard et comportement incorrect avec AltGraph. Plus d'informations
Si cela est important et/ou si la compatibilité ascendante l’est, vous pouvez utiliser la détection de caractéristiques comme dans le code suivant:
Notez que la key
value est différente de keyCode
ou which
de cette propriété: elle contient le nom de la clé et non son code. Si votre programme a besoin de codes de caractères, vous pouvez utiliser charCodeAt()
. Pour les caractères imprimables simples, vous pouvez utiliser charCodeAt()
, si vous utilisez des clés dont les valeurs contiennent plusieurs caractères, comme ArrowUp les chances sont les suivantes: vous testez des clés spéciales et prenez les mesures qui s’imposent. Essayez donc d'implémenter une table de valeurs de clés et leurs codes correspondants charCodeArr["ArrowUp"]=38
, charCodeArr["Enter"]=13
, charCodeArr[Escape]=27
... et ainsi de suite, jetez un coup d'œil à Key Valeurs et leurs codes correspondants
if(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 */
Peut-être souhaitez-vous envisager une compatibilité en aval si vous utilisez les propriétés héritées lorsqu'elles sont disponibles, et uniquement lorsqu'elles sont supprimées, passez aux nouvelles:
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;
}
Voir aussi: la propriété KeyboardEvent.code
docs et quelques détails supplémentaires dans cette réponse .
TLDR: Je suggérerais que vous devriez utiliser le nouveau event.key
et event.code
propriétés au lieu de celles héritées. IE et Edge prennent en charge ces propriétés, mais ne prennent pas encore en charge les nouveaux noms de clé. Pour eux, il existe un petit polyfill qui leur permet de générer les noms de clé/code standard:
https://github.com/shvaikalesh/shim-keyboard-event-key
Je suis venu à cette question à la recherche de la raison du même avertissement MDN que OP. Après avoir cherché plus, le problème avec keyCode
devient plus clair:
Le problème avec keyCode
est que les claviers non anglais peuvent produire différentes sorties et que même les claviers avec des dispositions différentes peuvent produire des résultats incohérents. De plus, il y avait le cas de
Si vous lisez les spécifications du W3C: https://www.w3.org/TR/uievents/#interface-keyboardevent
En pratique, keyCode et charCode sont incohérents sur toutes les plates-formes et même la même mise en œuvre sur différents systèmes d'exploitation ou en utilisant différentes localisations.
Il va un peu en profondeur décrivant ce qui n'allait pas avec keyCode
: https://www.w3.org/TR/uievents/#legacy-key-attributes
Ces fonctionnalités n'ont jamais été spécifiées formellement et les implémentations actuelles du navigateur varient considérablement. La grande quantité de contenu hérité, y compris les bibliothèques de scripts, reposant sur la détection de l'agent utilisateur et agissant en conséquence, signifie que toute tentative de formalisation de ces attributs et événements hérités risquerait de compromettre la quantité de contenu corrigée ou activée. De plus, , ces attributs ne conviennent pas à une utilisation internationale et ne répondent pas non plus aux problèmes d'accessibilité.
Ainsi, après avoir déterminé la raison pour laquelle l'ancien code source a été remplacé, examinons ce que vous devez faire aujourd'hui:
key
et code
).MDN a déjà fourni une solution:
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);