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?


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
 }

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...
    }
});

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

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é.


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);
   }
});

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


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');
     }
 });

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


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 !!!


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"



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
 }

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.


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/


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/


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


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


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){

    }
});

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>

2

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

$("#element").keydown(function(event) {
    if (event.keyCode == 13) {
        localiza_cep(this.value);
    }
});

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


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!');
    }
});
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.