jQuery Event Keypress: Quelle touche a été enfoncée?

706

Avec jQuery, comment savoir quelle touche a été enfoncée lorsque je me lie à l'événement de pression de touche?

$('#searchbox input').bind('keypress', function(e) {});

Je veux déclencher une soumission lorsque vous ENTERappuyez sur.

[Mise à jour]

Même si j'ai trouvé la réponse (ou mieux: une) moi-même, il semble y avoir une certaine marge de variation;)

Y a-t-il une différence entre keyCodeet which- surtout si je cherche juste ENTER, qui ne sera jamais une clé unicode?

Certains navigateurs fournissent-ils une propriété et d'autres fournissent-ils l'autre?

BlaM
la source
295
** Si quelqu'un a atteint cela depuis Google (comme je l'ai fait), sachez que "keyup" au lieu de "keypress" fonctionne dans Firefox, IE et Chrome. "keypress" ne fonctionne apparemment que dans Firefox.
Tyler
17
aussi, "keydown" fonctionne mieux que "keyup" pour déclencher un événement APRÈS avoir appuyé sur la touche (évidemment) mais cela est important si vous dites vouloir déclencher un événement sur le SECOND retour arrière si une zone de texte est vide
Tyler
12
Quant à e.keyCode VS e.which ... D'après mes tests, Chrome et IE8: le gestionnaire keypress () ne sera déclenché que pour les caractères normaux (c'est-à-dire pas Up / Down / Ctrl), et e.keyCode et e. qui renverra le code ASCII. Dans Firefox cependant, toutes les touches déclencheront la pression de touche (), MAIS: pour les caractères normaux e.which retournera le code ASCII et e.keyCode renverra 0, et pour les caractères spéciaux (par exemple Up / Down / Ctrl) e.keyCode reviendra le code du clavier, et e.which retournera 0. Comment amusant.
jackocnr
4
Avertissement: N'utilisez PAS celui du code Google. L'auteur de jquery a soumis un correctif, qui se trouve uniquement sur le référentiel github (et la fourchette de John Resig également): github.com/tzuryby/jquery.hotkeys . Celui du code Google se comporte mal lors de la liaison de plusieurs événements clés au même nœud dom. Le nouveau le résout.
Daniel Ribeiro
4
"keyup" sera déclenché très très tard lorsque vous p. ex. appuyez longuement sur une touche. Voir ici jsbin.com/aquxit/3/edit donc keydown est la voie à suivre
Toskan

Réponses:

844

En fait, c'est mieux:

 var code = e.keyCode || e.which;
 if(code == 13) { //Enter keycode
   //Do something
 }
Eran Galperin
la source
84
if ((e.keyCode || e.which) == 13)? ;)
Kezzer
49
Selon un commentaire plus bas sur cette page, jQuery normalise de sorte que «qui» est défini à chaque fois sur l'objet événement. Ainsi, la vérification de «keyCode» ne devrait pas être nécessaire.
Ztyx
197
Pourquoi l'énorme nombre de votes positifs? La question concerne jQuery, qui normalise ce genre de choses, donc il n'est pas nécessaire d'utiliser autre chose quee.which , quel que soit l'événement que vous utilisez.
Tim Down du
48
@Tim: Hélas, je viens de tester cela avec Firefox en utilisant api.jquery.com/keypress : lorsque j'appuie sur <Tab>, e.whichn'est pas défini (reste 0), mais l' e.keyCodeest ( 9). Voir stackoverflow.com/questions/4793233/… pourquoi cela compte.
Marcel Korpel
3
@Marcel: Oui, la gestion des clés de jQuery a des lacunes et c'est un exemple malheureux, mais pour la clé Entrée, c'est ce que cette question pose, la situation est extrêmement simple.
Tim Down du
133

Essaye ça

$('#searchbox input').bind('keypress', function(e) {
    if(e.keyCode==13){
        // Enter pressed... do anything here...
    }
});
Vladimir Prudnikov
la source
5
@VladimirPrudnikov Oh, oh, Ahhhh! Ahh! il y avait evey de mac à ce lien - l'humanité !!!
Ben DeMott
1
Eh bien, nous avons également lancé une nouvelle version avec l'application Windows. Découvrez snippets.me
Vladimir Prudnikov
2
@VladimirPrudnikov que diriez-vous d'une version linux?
Arda
@Arda nous n'avons aucun plan pour la version linux. Il y aura une application web et une API publique, donc peut-être que quelqu'un la créera :)
Vladimir Prudnikov
1
Ha ha ha, un outil de développement sans projet pour Linux. Riches!
Ziggy
61

Si vous utilisez jQuery UI, vous avez des traductions pour les codes de clé communs. Dans ui / ui / ui.core.js :

$.ui.keyCode = { 
    ...
    ENTER: 13, 
    ...
};

Il y a aussi quelques traductions dans tests / simulate / jquery.simulate.js mais je n'ai pas pu en trouver dans la bibliothèque JS principale. Remarquez, je n'ai fait que grpper les sources. Il existe peut-être un autre moyen de se débarrasser de ces nombres magiques.

Vous pouvez également utiliser String.charCodeAt et .fromCharCode:

>>> String.charCodeAt('\r') == 13
true
>>> String.fromCharCode(13) == '\r'
true
user35612
la source
13
Correction c'est * $. Ui.keyCode.ENTER ** pas * $. KeyCode.ENTER - fonctionne comme un charme si thx pour la pointe!
daniellmb
Uncaught TypeError: String.charCodeAt is not a functionJe pense que vous vouliez dire'\r'.charCodeAt(0) == 13
Patrick Roberts
39

Étant donné que vous utilisez jQuery, vous devez absolument utiliser .which. Oui, différents navigateurs définissent des propriétés différentes, mais jQuery les normalisera et définira la valeur .which dans chaque cas. Voir la documentation sur http://api.jquery.com/keydown/ il indique:

Pour déterminer quelle touche a été enfoncée, nous pouvons examiner l'objet événement transmis à la fonction de gestionnaire. Alors que les navigateurs utilisent différentes propriétés pour stocker ces informations, jQuery normalise la propriété .which afin que nous puissions l'utiliser de manière fiable pour récupérer le code clé.

Frank Schwieterman
la source
2
D'après ce que j'ai vu en utilisant event.which et en essayant de comparer à $ .ui.keyCode, le comportement est incertain. Plus précisément, la touche [L] minuscule qui correspond à $ .ui.keyCode.NUMPAD_ENTER. Mignonne.
Danny
4
Avez-vous une repro qui illustre ce bogue? Il est préférable de signaler cela aux propriétaires de jQuery plutôt que d'essayer de réimplémenter leur travail.
Frank Schwieterman
31

... cet exemple empêche la soumission du formulaire (régulièrement l'intention de base lors de la capture de la touche # 13):

$('input#search').keypress(function(e) {
  if (e.which == '13') {
     e.preventDefault();
     doSomethingWith(this.value);
   }
});
user184365
la source
28

edit: Cela ne fonctionne que pour IE ...

Je me rends compte que c'est une ancienne publication, mais quelqu'un pourrait trouver cela utile.

Les événements clés sont mappés, donc au lieu d'utiliser la valeur du code clé, vous pouvez également utiliser la valeur clé pour la rendre un peu plus lisible.

$(document).ready( function() {
    $('#searchbox input').keydown(function(e)
    {
     setTimeout(function ()
     { 
       //rather than using keyup, you can use keydown to capture 
       //the input as it's being typed.
       //You may need to use a timeout in order to allow the input to be updated
     }, 5);
    }); 
    if(e.key == "Enter")
    {
       //Enter key was pressed, do stuff
    }else if(e.key == "Spacebar")
    {
       //Spacebar was pressed, do stuff
    }
});

Voici une feuille de triche avec les clés mappées que j'ai obtenues de ce blog entrez la description de l'image ici

Kevin
la source
5
Il n'y a aucune e.keypropriété.
SLaks
3
Hmm, on dirait que c'est une propriété spécifique à IE. Cela fonctionne pour mon application dans IE mais pas pour Chrome. Je suppose que j'utilise keycode.
Kevin
28
 // in jquery source code...
 if (!event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode)) {
     event.which = event.charCode || event.keyCode;
 }

 // So you have just to use
 $('#searchbox input').bind('keypress', function(e) {
     if (e.which === 13) {
         alert('ENTER WAS PRESSED');
     }
 });
Luca Filosofi
la source
1
Telle est la vraie réponse. L'accepté fonctionnera pour certaines clés (comme entrer) mais échouera pour d'autres (comme supr qui sera confondu par a.)
Oscar Foley
19
Il s'agit d'un collage direct à partir de la source jQuery et du code utilisé par jQuery pour normaliser la propriété d'événement .which.
Ian Clelland
@Ian Clelland: je ne comprends pas votre point, est-ce que cela fonctionne bien ou non!? lol
Luca Filosofi
13
Ça marche; J'en suis sûr, car jQuery utilise exactement ce code :) Si vous avez déjà jQuery disponible, alors utilisez-le simplement - vous n'avez pas besoin de l'avoir dans votre propre code.
Ian Clelland
1
@aSeptik: La question était "J'ai jQuery; comment puis-je obtenir la touche enfoncée" - votre réponse montre comment jQuery l'obtient en premier lieu. Mon point était que puisque jQuery contient déjà cette ligne de code, il n'en a pas besoin. Il peut simplement utiliser event.which.
Ian Clelland
21

Découvrez l'excellent plugin jquery.hotkeys qui prend en charge les combinaisons de touches:

$(document).bind('keydown', 'ctrl+c', fn);
user397198
la source
14
$(document).ready(function(){
    $("#btnSubmit").bind("click",function(){$('#'+'<%=btnUpload.ClientID %>').trigger("click");return false;});
    $("body, input, textarea").keypress(function(e){
        if(e.which==13) $("#btnSubmit").click();
    });
});

J'espère que cela peut vous aider !!!


la source
12

C'est à peu près la liste complète des codes clés:

3: "break",
8: "backspace / delete",
9: "tab",
12: 'clear',
13: "enter",
16: "shift",
17: "ctrl",
18: "alt",
19: "pause/break",
20: "caps lock",
27: "escape",
28: "conversion",
29: "non-conversion",
32: "spacebar",
33: "page up",
34: "page down",
35: "end",
36: "home ",
37: "left arrow ",
38: "up arrow ",
39: "right arrow",
40: "down arrow ",
41: "select",
42: "print",
43: "execute",
44: "Print Screen",
45: "insert ",
46: "delete",
48: "0",
49: "1",
50: "2",
51: "3",
52: "4",
53: "5",
54: "6",
55: "7",
56: "8",
57: "9",
58: ":",
59: "semicolon (firefox), equals",
60: "<",
61: "equals (firefox)",
63: "ß",
64: "@ (firefox)",
65: "a",
66: "b",
67: "c",
68: "d",
69: "e",
70: "f",
71: "g",
72: "h",
73: "i",
74: "j",
75: "k",
76: "l",
77: "m",
78: "n",
79: "o",
80: "p",
81: "q",
82: "r",
83: "s",
84: "t",
85: "u",
86: "v",
87: "w",
88: "x",
89: "y",
90: "z",
91: "Windows Key / Left ⌘ / Chromebook Search key",
92: "right window key ",
93: "Windows Menu / Right ⌘",
96: "numpad 0 ",
97: "numpad 1 ",
98: "numpad 2 ",
99: "numpad 3 ",
100: "numpad 4 ",
101: "numpad 5 ",
102: "numpad 6 ",
103: "numpad 7 ",
104: "numpad 8 ",
105: "numpad 9 ",
106: "multiply ",
107: "add",
108: "numpad period (firefox)",
109: "subtract ",
110: "decimal point",
111: "divide ",
112: "f1 ",
113: "f2 ",
114: "f3 ",
115: "f4 ",
116: "f5 ",
117: "f6 ",
118: "f7 ",
119: "f8 ",
120: "f9 ",
121: "f10",
122: "f11",
123: "f12",
124: "f13",
125: "f14",
126: "f15",
127: "f16",
128: "f17",
129: "f18",
130: "f19",
131: "f20",
132: "f21",
133: "f22",
134: "f23",
135: "f24",
144: "num lock ",
145: "scroll lock",
160: "^",
161: '!',
163: "#",
164: '$',
165: 'ù',
166: "page backward",
167: "page forward",
169: "closing paren (AZERTY)",
170: '*',
171: "~ + * key",
173: "minus (firefox), mute/unmute",
174: "decrease volume level",
175: "increase volume level",
176: "next",
177: "previous",
178: "stop",
179: "play/pause",
180: "e-mail",
181: "mute/unmute (firefox)",
182: "decrease volume level (firefox)",
183: "increase volume level (firefox)",
186: "semi-colon / ñ",
187: "equal sign ",
188: "comma",
189: "dash ",
190: "period ",
191: "forward slash / ç",
192: "grave accent / ñ / æ",
193: "?, / or °",
194: "numpad period (chrome)",
219: "open bracket ",
220: "back slash ",
221: "close bracket / å",
222: "single quote / ø",
223: "`",
224: "left or right ⌘ key (firefox)",
225: "altgr",
226: "< /git >",
230: "GNOME Compose Key",
231: "ç",
233: "XF86Forward",
234: "XF86Back",
240: "alphanumeric",
242: "hiragana/katakana",
243: "half-width/full-width",
244: "kanji",
255: "toggle touchpad"
Ivan
la source
6

Voici une description détaillée du comportement des différents navigateurs http://unixpapa.com/js/key.html

Phil
la source
2
C'est absolument la page que tout le monde se débattant pour fournir des réponses désespérées devrait être en train de lire.
Tim Down du
5

Je vais simplement compléter le code de solution avec cette ligne e.preventDefault();. En cas de champ de saisie du formulaire nous n'assistons pas à la soumission lors de la saisie pressée

var code = (e.keyCode ? e.keyCode : e.which);
 if(code == 13) { //Enter keycode
   e.preventDefault();
   //Do something
 }
dzona
la source
4

Ajoutez une soumission cachée, ne tapez pas caché, envoyez simplement avec style = "display: none". Voici un exemple (suppression des attributs inutiles du code).

<form>
  <input type="text">
  <input type="submit" style="display:none">
</form>

il acceptera la clé d'entrée en natif, pas besoin de JavaScript, fonctionne dans tous les navigateurs.

Pedja
la source
4

Voici une extension jquery qui gérera la touche entrée pressée.

(function ($) {
    $.prototype.enterPressed = function (fn) {
        $(this).keyup(function (e) {
            if ((e.keyCode || e.which) == 13) {
                fn();
            }
        });
    };
}(jQuery || {}));

$("#myInput").enterPressed(function() {
    //do something
});

Un exemple de travail peut être trouvé ici http://jsfiddle.net/EnjB3/8/

Reid Evans
la source
4

Sorcière ;)

/*
This code is for example. In real life you have plugins like :
https://code.google.com/p/jquery-utils/wiki/JqueryUtils
https://github.com/jeresig/jquery.hotkeys/blob/master/jquery.hotkeys.js
https://github.com/madrobby/keymaster
http://dmauro.github.io/Keypress/

http://api.jquery.com/keydown/
http://api.jquery.com/keypress/
*/

var event2key = {'97':'a', '98':'b', '99':'c', '100':'d', '101':'e', '102':'f', '103':'g', '104':'h', '105':'i', '106':'j', '107':'k', '108':'l', '109':'m', '110':'n', '111':'o', '112':'p', '113':'q', '114':'r', '115':'s', '116':'t', '117':'u', '118':'v', '119':'w', '120':'x', '121':'y', '122':'z', '37':'left', '39':'right', '38':'up', '40':'down', '13':'enter'};

var documentKeys = function(event) {
    console.log(event.type, event.which, event.keyCode);

    var keycode = event.which || event.keyCode; // par exemple : 112
    var myKey = event2key[keycode]; // par exemple : 'p'

    switch (myKey) {
        case 'a':
            $('div').css({
                left: '+=50'
            });
            break;
        case 'z':
            $('div').css({
                left: '-=50'
            });
            break;
        default:
            //console.log('keycode', keycode);
    }
};

$(document).on('keydown keyup keypress', documentKeys);

Démo: http://jsfiddle.net/molokoloco/hgXyq/24/

molokoloco
la source
4

Utilisez event.keyet JS moderne!

Plus de codes numériques . Vous pouvez vérifier la clé directement. Par exemple "Enter", "LeftArrow", "r"ou "R".

const input = document.getElementById("searchbox");
input.addEventListener("keypress", function onEvent(event) {
    if (event.key === "Enter") {
        // Submit
    }
    else if (event.key === "Q") {
        // Play quacking duck sound, maybe...
    }
});

Documents Mozilla

Navigateurs pris en charge

Gibolt
la source
3
$(document).bind('keypress', function (e) {
    console.log(e.which);  //or alert(e.which);

});

vous devriez avoir firbug pour voir un résultat dans la console

manny
la source
3

Certains navigateurs utilisent keyCode, d'autres utilisent lesquels. Si vous utilisez jQuery, vous pouvez l'utiliser de manière fiable car jQuery standardise les choses. Réellement,

$('#searchbox input').bind('keypress', function(e) {
    if(e.keyCode==13){

    }
});
Hitesh Modha
la source
2

Selon la réponse de Kilian:

Si seule la touche entrée est importante:

<form action="javascript:alert('Enter');">
<input type=text value="press enter">
</form>

la source
2

La façon la plus simple que je fais est:

$("#element").keydown(function(event) {
    if (event.keyCode == 13) {
        localiza_cep(this.value);
    }
});
Rodolfo Jorge Nemer Nogueira
la source
1
Il serait préférable d'utiliser event.whichau lieu de event.keyCode. De jQuery API :The event.which property normalizes event.keyCode and event.charCode. It is recommended to watch event.which for keyboard key input.
zanetu
2

Je viens de faire un plugin pour jQuery qui permet plus facilement keypress événements . Au lieu d'avoir à trouver le numéro et à le mettre, tout ce que vous avez à faire est le suivant:

Comment l'utiliser

  1. Inclure le code que j'ai ci-dessous
  2. Exécutez ce code:
$(document).keydown(function(e) {
    if (getPressedKey(e) == theKeyYouWantToFireAPressEventFor /*Add 'e.ctrlKey here to only fire if the combo is CTRL+theKeyYouWantToFireAPressEventFor'*/) {
        // Your Code To Fire When You Press theKeyYouWantToFireAPressEventFor 
    }
});

C'est si simple. Veuillez noter qu'il netheKeyYouWantToFireAPressEventFor s'agit pas d' un nombre, mais d'une chaîne (par exemple, "a"pour déclencher lorsque vous Aappuyez sur, "ctrl"pour déclencher lorsque vous appuyez sur, ou, dans le cas d'un nombre, simplement , pas de guillemets. Cela se déclencherait lorsque vous appuyez sur).CTRL (control)11

L'exemple / code:

Parce que la version longue est tellement ... eh bien ... longue, j'ai fait un lien PasteBin pour elle:
http://pastebin.com/VUaDevz1

Zach Barham
la source
Vous pouvez rendre la fonction beaucoup plus courte et plus rapide si vous n'utilisez pas des millions de comparaisons "si" -> jsfiddle.net/BlaM/bcguctrx - Sachez également que - par exemple - openbracket et closebracket ne sont pas des crochets ouverts / fermés sur un Clavier allemand ».
BlaM
J'ai aimé cette solution. agréable.
Jay
-9

Essaye ça:

jQuery('#myInput').keypress(function(e) {
    code = e.keyCode ? e.keyCode : e.which;
    if(code.toString() == 13) {
        alert('You pressed enter!');
    }
});
Omar Yepez
la source