Comment différencier les touches "Entrée" et "retour" en Javascript?
certaines applications de bureau traitent différemment la touche' Retour chariot 'et la touche' Entrée ' de la numpad. J'ai remarqué que ces deux clés génèrent le même keyCode (13) en Javascript (jQuery).
Sont-ils convertis à l'égalité dans le navigateur de l'environnement, ou est-il possible de faire la différence entre eux (ie. faire en sorte que le CR crée une nouvelle ligne dans une zone de texte, et que la touche "Entrée" soumette son formulaire ?
3 réponses
Voir Jan Wolters’ traité Javascript De La Folie: Les Événements De Clavier.
Enter
et Numpad Enter
les deux donnent le même code, i.e. 13, parce que les navigateurs ne font pas de différence entre les deux clés. Pour être honnête, ni la plupart des environnements. Il est possible de les différencier en utilisant L'API Windows (par exemple), mais cela demande un effort supplémentaire. Ceci, cependant, ne relève pas du champ d'application du navigateur abstraction.
UPDATE
en tant Que projet de Loi Thorne légitimement mentionne, le KeyboardEvent
objet sport a location
propriété de nos jours.
les valeurs possibles sont:
DOM_KEY_LOCATION_STANDARD
0
La clé a une seule version, ou ne peut pas distinguer entre la gauche et la droite les versions de la clé, et n'a pas été pressé sur le numérique clavier ou un clé considérée comme faisant partie du clavier.
DOM_KEY_LOCATION_LEFT
1
La clé est la version gauche de la clé; par exemple, la touche de contrôle gauche a été pressée sur un standard 101 touche du clavier US. Cette valeur est utilisée uniquement pour les clés qui ont plus que un emplacement possible sur le clavier.
DOM_KEY_LOCATION_RIGHT
2
le la clé était la version droite de la clé; par exemple, la main droite La touche de contrôle est pressée sur un 101 standard touche du clavier US. Cette valeur n'est utilisé que pour les clés qui ont plus d'un emplacement possible sur le clavier.
DOM_KEY_LOCATION_NUMPAD
3
La clé était sur le numérique clavier, ou a un code clé virtuel qui correspond au numérique clavier.Note: quand NumLock est verrouillé, Gecko retourne toujours DOM_KEY_LOCATION_NUMPAD pour les clés sur le pavé numérique. Autrement, quand NumLock est déverrouillé et que le clavier a effectivement un numérique clavier, Gecko renvoie toujours DOM_KEY_LOCATION_NUMPAD too. Sur l'autre part, si le clavier ne dispose pas d'un clavier, comme sur un ordinateur portable ordinateur, certaines clés ne deviennent inutiles que lorsque NumLock est verrouillé. Lorsque de telles clés feux d'événements clés, la valeur d'attribut de localisation dépend clé. Autrement dit, il ne doit pas être DOM_KEY_LOCATION_NUMPAD. Note: Les événements clés de NumLock key indiquent DOM_KEY_LOCATION_STANDARD à la fois sur Gecko et Internet Explorer.
S'il y a une touche sur le clavier qui est physiquement différente, les applications de navigateur devraient être tout aussi capables que les applications de bureau pour différencier.
avec les dernières versions de Chrome (39.0.2171.95 m), Firefox (32.0.3), IE (11.0.9600.17501) et Opera (12.17), l'objet d'événement clavier possède maintenant la Propriété location. Je présume que cette propriété existe depuis un certain temps, bien qu'elle soit légèrement documentée.
Les Tests d'onkeydown révèlent que lorsque la touche Entrée" normale " est pressée, le code de saisie est de 13 et l'emplacement de 0; lorsque le bouton entrée est pressé, le code de saisie est de 13 et l'emplacement de 3.
ainsi le code suivant peut être utilisé pour définir key= = 13 si la Entrée, key= = 176 si numpad entrer:
window.onkeydown=function(ev)
{
var e= ev || window.event,
key = e.keyCode || e.which;
if ((key==13) &&
(e.location===3))
key=176; // 176 is the scancode for the numpad enter
// continued....
}
je fournis une mise à jour car cette question apparaît toujours près du haut des résultats de recherche google.
par MDN,KeyboardEvent.keyCode
et KeyBoardEvent.charCode
sont dépréciés et ne devraient plus être utilisés.
KeyboardEvent
les clés peuvent être déterminées en accédant au KeyboardEvent.key
,KeyboardEvent.code
et KeyboardEvent.location
propriétés.
KeyboardEvent.key
renvoie généralement ce que vous voyez dans un éditeur de texte pour les clés de sortie et le nom sur les clés non-sortie (y compris être sensible à la casse).
KeyboardEvent.code
renvoie une description de chaîne de caractères de la clé.
KeyboardEvent.location
renvoie un entier entre 0 et 3 pour signifier la zone du clavier dans laquelle se trouve la touche (standard, gauche, droite, et numpad respectivement).
Comprendre la différence entre ces propriétés peuvent aider à déterminer qui sera le plus approprié pour votre situation donnée. Dans le le cas de cette question: event.key
renvoie la même sortie ("Enter"
) pour les' carriage return 'et' numpad enter', alors que event.code
retour "Enter"
et "NumpadEnter"
respectivement.
dans ce cas, si vous voulez faire la différence entre les touches numpad et clavier, vous pouvez utiliser event.code
. Si vous vouliez que leur opération soit la même,event.key
serait un meilleur choix.
Si vous voulait différencier entre autres touches, telles que la gauche et la droite Ctrl
touches, vous aussi, vous souhaitez regarder les event.location
propriété.
j'ajoute un petit jeu d'événements clavier pour voir la différence entre ces propriétés d'événements. Crédit MDN pour la fourniture d' le concept je n'ai légèrement modifié ci-dessous:
window.addEventListener("keydown", function(event) {
let str = "key = '" + event.key +
"'   code = '" + event.code + "'" +
"'   location = '" + event.location + "'" ;
let el = document.createElement("span");
el.innerHTML = str + "<br/>";
document.getElementById("output").appendChild(el);
}, true);
#output {
font-family: Arial, Helvetica, sans-serif;
overflow-y: auto;
margin-left: 4em
}
#output span {
line-height: 2em;
}
#output :nth-child(2n) {
color: blue;
}
<!-- Learn about this code on MDN: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code -->
<p>
Press keys on the keyboard to see what the KeyboardEvent's key and code values are for each one.
</p>
<div id="output"></div>