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 ?

17
demandé sur Soviut 2011-03-24 14:22:29

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.

Mozilla Developer Network:

les valeurs possibles sont:

DOM_KEY_LOCATION_STANDARD0 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_LEFT1 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_RIGHT2 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_NUMPAD3 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.

15
répondu Martijn 2017-05-23 11:47:08

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....
}
9
répondu Bill Thorne 2015-01-13 16:11:17

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 + 
              "' &nbsp code = '" + event.code + "'" + 
              "' &nbsp 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>
1
répondu Isaac B 2017-06-22 05:55:52