Quel code clé pour la touche d'échappement avec jQuery

559

J'ai deux fonctions. Lorsque enter est enfoncé, les fonctions s'exécutent correctement, mais lorsque escape est enfoncé, il ne fonctionne pas. Quel est le bon numéro pour la touche d'échappement?

$(document).keypress(function(e) { 
    if (e.which == 13) $('.save').click();   // enter (works as expected)
    if (e.which == 27) $('.cancel').click(); // esc   (does not work)
});
Shishant
la source
Keypress renverra un caractère connecté à une touche (en majuscules, etc.), Keyup renverra le nombre de boutons matériels enfoncés. Pour ESC, vous voudriez le code matériel 27 (pas le caractère ascii 27)
Joeri
Il existe une astuce très simple pour trouver le keyCode que vous souhaitez. Ouvrez simplement un nouvel onglet, placez-le document.addEventListener("keydown", e => console.log(e.keyCode))dans la console de votre navigateur, cliquez dans la fenêtre et appuyez sur la touche que vous recherchez.
anarchist912

Réponses:

926

Essayez avec l' événement keyup :

$(document).keyup(function(e) {
  if (e.keyCode === 13) $('.save').click();     // enter
  if (e.keyCode === 27) $('.cancel').click();   // esc
});
CMS
la source
39
Cela n'a rien à voir avec la touche par rapport à la touche. Pour capturer ESCAPE, vous devez regarder e.keyCode par opposition à e.which (ce que cet exemple arrive à faire).
dkamins
211
"Cela n'a rien à voir avec les touches et les touches" - c'est incorrect, dkamins. keypress ne semble pas être géré de manière cohérente entre les navigateurs (essayez la démo sur api.jquery.com/keypress dans IE vs Chrome vs Firefox - parfois, il ne s'enregistre pas, et les options «which» et «keyCode» varient) tandis que la saisie est cohérente. e.qui est la valeur normalisée jquery, donc 'which' ou 'keyCode' devraient tous les deux fonctionner en keyup.
Jordan Brough
13
@Jordan Brough - Je voudrais vous demander de poster votre commentaire comme réponse afin que les gens le lisent et comprennent la signification réelle de votre commentaire! puisque votre commentaire est aussi important que la réponse l'expliquant
Murtaza
15
keydownimitera le comportement natif - au moins sous Windows où appuyer sur ESC ou Retour dans une boîte de dialogue déclenchera l'action avant que la touche ne soit relâchée.
thomthom
2
@gibberish J'ai ajouté mon commentaire comme réponse ici: stackoverflow.com/a/28502629/58876
Jordan Brough
77

Plutôt que de coder en dur les valeurs de code dans votre fonction, pensez à utiliser des constantes nommées pour mieux transmettre votre sens:

var KEYCODE_ENTER = 13;
var KEYCODE_ESC = 27;

$(document).keyup(function(e) {
  if (e.keyCode == KEYCODE_ENTER) $('.save').click();
  if (e.keyCode == KEYCODE_ESC) $('.cancel').click();
});

Certains navigateurs (comme FireFox, peu sûrs des autres) définissent un KeyEventobjet global qui expose ces types de constantes pour vous. Cette question SO montre également une belle façon de définir cet objet dans d'autres navigateurs.

Seth Petry-Johnson
la source
15
Quoi, 27 ne se contente pas de vous sauter dessus comme étant la touche d'échappement?!? Honnêtement, cela doit vraiment être fait par plus de gens. Je les appelle «nombres magiques» et «cordes magiques». Que signifie 72? Pourquoi avez-vous une chaîne très spécifique et volatile copiée-collée 300 fois dans votre base de code? etc.
vbullinger
1
Ou vous pouvez simplement ajouter un commentaire au-dessus de chacun, car vous ne les utiliserez probablement qu'une seule fois. IMO tout aussi lisible
Ivan Durst
8
@IvanDurst, vous ne les utilisez peut-être qu'une fois par méthode , mais je les utilise plusieurs fois dans mes projets. Suggérez-vous vraiment que vous souhaitez (1) rechercher les valeurs et (2) les commenter chaque fois que vous souhaitez utiliser un code clé? Je ne sais pas pour vous, mais je n'ai ni le désir de les mémoriser ni la conviction que d'autres programmeurs les commenteront de manière cohérente. Il s'agit de rendre le codage plus facile et plus cohérent, pas seulement plus lisible.
Seth Petry-Johnson
2
Quelqu'un qui sait ce qu'il veut dire n'a pas à chercher la signification pour le commenter, et taper un commentaire est aussi rapide que taper un nom long.
NetMage
6
Qu'est-il arrivé au bon vieux temps où nous codions les constantes de caractères en hexadécimal? Tout le monde sait que ESC est 0x1Bet Enter est 0x0D, non?
David R Tribble
42

(Réponse extraite de mon commentaire précédent )

Vous devez utiliser keyupplutôt que keypress. par exemple:

$(document).keyup(function(e) {
  if (e.which == 13) $('.save').click();     // enter
  if (e.which == 27) $('.cancel').click();   // esc
});

keypressne semble pas être géré de manière cohérente entre les navigateurs (essayez la démo sur http://api.jquery.com/keypress dans IE vs Chrome vs Firefox. Parfois, keypressne s'enregistre pas, et les valeurs pour "which" et " keyCode 'varient) alors qu'il keyupest cohérent.

Puisqu'il y a eu une discussion sur e.whichvs e.keyCode: Notez que e.whichc'est la valeur normalisée jquery et celle recommandée pour l'utilisation:

La propriété event.which normalise event.keyCode et event.charCode. Il est recommandé de regarder event.which pour la saisie des touches du clavier.

(depuis http://api.jquery.com/event.which/ )

Jordan Brough
la source
5
Je voudrais également ajouter ici que les navigateurs qui ne se déclenchent pas keypressen cas de fuite le font correctement. keypressest destiné à ne se déclencher que lorsque la clé produit un personnage alors qu'il se keyupdéclenche toujours. developer.mozilla.org/en-US/docs/Web/Events/keypress
ohcibi
26

Pour trouver le code clé pour n'importe quelle clé, utilisez cette fonction simple:

document.onkeydown = function(evt) {
    console.log(evt.keyCode);
}
Hanzel
la source
14

27est le code de la touche d'échappement. :)

Salé
la source
1
J'ai deux fonctions lorsque enter est pressé les fonctions s'exécutent correctement mais pas avec la touche d'échappement .. $ (document) .keypress (fonction (e) {if (e.which == 13) {$ ('. Save'). Click ();} if (e.which == 27) {$ ('. cancel'). cliquez sur ();}});
Shishant
$ (document) .keypress (fonction (e) {y = e.keyCode? e.keyCode: e.which;}); Lorsque j'alerte (y), il alerte 27 dans IE et FF. Êtes-vous sûr qu'il n'y a pas d'autre problème avec votre code?
Salty
14

Votre meilleur pari est

$(document).keyup(function(e) { 
    if (e.which === 13) $('.save').click();   // enter 
    if (e.which === 27) $('.cancel').click(); // esc   

    /* OPTIONAL: Only if you want other elements to ignore event */
    e.preventDefault();
    e.stopPropagation();
});

Sommaire

  • whichest plus préférable que keyCodeparce qu'elle est normalisée
  • keyupest plus préférable que keydownparce que la frappe peut se produire plusieurs fois si l'utilisateur la maintient enfoncée.
  • Ne l'utilisez keypressque si vous souhaitez capturer des personnages réels.

Fait intéressant, Bootstrap utilise keydown et keyCode dans son composant déroulant (à partir de 3.0.2)! Je pense que c'est probablement un mauvais choix là-bas.

Extrait associé du document JQuery

Alors que les navigateurs utilisent différentes propriétés pour stocker ces informations, jQuery normalise la propriété .which afin que vous puissiez l'utiliser de manière fiable pour récupérer le code clé. Ce code correspond à une touche du clavier, y compris les codes des touches spéciales telles que les flèches. Pour capturer une entrée de texte réelle, .keypress () peut être un meilleur choix.

Autre élément d'intérêt: JavaScript Keypress Library

Shital Shah
la source
10

Essayez le plugin jEscape ( téléchargement depuis Google Drive )

$(document).escape(function() { 
   alert('ESC button pressed'); 
});

ou obtenez le code clé pour le navigateur croisé

var code = (e.keyCode ? e.keyCode : e.which);
if (code === 27) alert('ESC');
if (code === 13) alert('ENTER');

vous pouvez peut-être utiliser le commutateur

var code = (e.keyCode ? e.keyCode : e.which);
switch (code) {
    case 27:
       alert('ESC');
       break;
     case 13:
       alert('ENTER');
       break;
}
S. Ferit Arslan
la source
8

Votre code fonctionne très bien. C'est probablement la fenêtre qui n'est pas focalisée. J'utilise une fonction similaire pour fermer les boîtes iframe, etc.

$(document).ready(function(){

    // Set focus
    setTimeout('window.focus()',1000);

});

$(document).keypress(function(e) {

    // Enable esc
    if (e.keyCode == 27) {
      parent.document.getElementById('iframediv').style.display='none';
      parent.document.getElementById('iframe').src='/views/view.empty.black.html';
    }

});
Eric Herlitz
la source
8

J'essayais de faire la même chose et ça me dérangeait. Dans Firefox, il semble que si vous essayez de faire certaines choses lorsque la touche d'échappement est enfoncée, il continue de traiter la touche d'échappement qui annule ensuite tout ce que vous essayez de faire. L'alerte fonctionne bien. Mais dans mon cas, je voulais revenir dans l'histoire qui n'a pas fonctionné. Enfin compris que je devais forcer la propagation de l'événement à s'arrêter comme indiqué ci-dessous ...

if (keyCode == 27)
{
    history.back();

    if (window.event)
    {
        // IE works fine anyways so this isn't really needed
        e.cancelBubble = true;
        e.returnValue = false;
    }
    else if (e.stopPropagation)
    {
        // In firefox, this is what keeps the escape key from canceling the history.back()
        e.stopPropagation();
        e.preventDefault();
    }

    return (false);
}
Billy Buerger
la source
8

Pour expliquer où les autres réponses n'ont pas; le problème est votre utilisation de keypress.

Peut-être que l'événement est simplement mal nommé mais keypressest défini pour se déclencher quand . C'est-à-dire du texte. Alors que ce que vous voulez est / , qui se déclenche à chaque fois (respectivement avant ou après) . C'est à dire ces choses sur le clavier.when an actualcharacteris being inserted
keydownkeyupthe user depresses akey

La différence apparaît ici car il escs'agit d'un caractère de contrôle (littéralement «caractère non imprimable») et n'écrit donc aucun texte, donc même pas de tir keypress.
enterest bizarre, car même si vous l'utilisez comme caractère de contrôle (c'est-à-dire pour contrôler l'interface utilisateur), il insère toujours un caractère de nouvelle ligne, qui se déclenchera keypress.

Source: quirksmode

Hashbrown
la source
1
Bravo pour avoir lu la spécification! Cela devrait être la réponse acceptée à coup sûr :)
DylanYoung
7

Pour obtenir le code hexadécimal pour tous les caractères: http://asciitable.com/

Julien
la source
2
J'allais dire ..... Je déteste que ce site soit en haut des résultats de recherche parce qu'il est vraiment horrible, mais il transmet les informations nécessaires.
mpen
1
Notez que selon l'événement et le navigateur, les codes de clé ne correspondent pas toujours aux tables ascii.
Alan H.
2
downvote: ne répond pas à la question, ne répond même pas à la question, hex n'a rien à voir avec la question et OP a déjà démontré sa connaissance de esc == 27.
Jeremy
7

Il suffit de poster une réponse mise à jour qui e.keyCodeest considérée comme obsolète sur MDN .

Vous devriez plutôt opter pour e.keyplutôt qui prend en charge les noms propres pour tout. Voici les pâtes de copie pertinentes

window.addEventListener("keydown", function (event) {
  if (event.defaultPrevented) {
    return; // Do nothing if the event was already processed
  }

  switch (event.key) {
    case "ArrowDown":
      // Do something for "down arrow" key press.
      break;
    case "ArrowUp":
      // Do something for "up arrow" key press.
      break;
    case "ArrowLeft":
      // Do something for "left arrow" key press.
      break;
    case "ArrowRight":
      // Do something for "right arrow" key press.
      break;
    case "Enter":
      // Do something for "enter" or "return" key press.
      break;
    case "Escape":
      // Do something for "esc" key press.
      break;
    default:
      return; // Quit when this doesn't handle the key event.
  }

  // Cancel the default action to avoid it being handled twice
  event.preventDefault();
}, true);
août
la source
3
Mais il ne semble être pris en charge que par Firefox et Chrome.
Gayan Weerakutti
Malheureusement, au moins certaines versions d'Internet Explorer transmettent le code Escplutôt que la norme Escape.
Robin Stewart
6

Une bibliothèque Javascript robuste pour capturer les saisies au clavier et les combinaisons de touches saisies. Il n'a pas de dépendances.

http://jaywcjlove.github.io/hotkeys/

hotkeys('enter,esc', function(event,handler){
    switch(handler.key){
        case "enter":$('.save').click();break;
        case "esc":$('.cancel').click();break;
    }
});

raccourcis clavier comprend les modificateurs suivants: , shiftoptionaltctrlcontrolcommand, et .

Les touches spéciales suivantes peuvent être utilisées pour les raccourcis: backspacetab, clear, enter, return, esc, escape, space, up, down, left, right, home, end, pageup, pagedown, del, deleteet à f1travers f19.

小弟 调 调
la source
5

J'ai toujours utilisé keyup et e.which pour attraper la touche d'échappement.

Dalius I
la source