jQuery Event Keypress: quale tasto è stato premuto?


706

Con jQuery, come faccio a sapere quale tasto è stato premuto quando mi associo all'evento keypress?

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

Voglio innescare un invio quando ENTERviene premuto.

[Aggiornare]

Anche se ho trovato la (o migliore: una) risposta da solo, sembra che ci sia un certo margine di variazione;)

C'è una differenza tra keyCodee which- specialmente se sto solo cercando ENTER, che non sarà mai una chiave unicode?

Alcuni browser forniscono una proprietà e altri forniscono l'altra?


295
** Se qualcuno ha raggiunto questo da Google (come ho fatto io), sappi che "keyup" invece di "keypress" funziona in Firefox, IE e Chrome. "Keypress" apparentemente funziona solo in Firefox.
Tyler,

17
inoltre, "keydown" funziona meglio di "keyup" per l'attivazione di un evento DOPO che il tasto è stato premuto (ovviamente) ma questo è importante se dici di voler attivare un evento sul SECONDO backspace se un'area di testo è vuota
Tyler

12
Per quanto riguarda e.keyCode VS e.which ... Dai miei test, Chrome e IE8: il gestore keypress () verrà attivato solo per caratteri normali (cioè non Su / Giù / Ctrl), e sia e.keyCode che e. che restituirà il codice ASCII. In Firefox, tuttavia, tutti i tasti attiveranno keypress (), MA: per i caratteri normali e.che restituirà il codice ASCII e e.keyCode restituirà 0, e per caratteri speciali (ad esempio Su / Giù / Ctrl) e.keyCode tornerà il codice della tastiera ed e. che restituirà 0. Che divertimento.
jackocnr,

4
Attenzione: NON utilizzare quello del codice google. L'autore di jquery ha inviato una patch, che è solo sul repository github (e anche sul fork di John Resig): github.com/tzuryby/jquery.hotkeys . Quello del codice google si comporta in modo errato quando si associa più di un evento chiave allo stesso nodo dom. Il nuovo lo risolve.
Daniel Ribeiro,

4
"keyup" verrà attivato molto tardi quando, ad esempio, si preme un tasto a lungo. Vedi qui jsbin.com/aquxit/3/edit, quindi il keydown è la strada da percorrere
Toskan

Risposte:


844

In realtà questo è meglio:

 var code = e.keyCode || e.which;
 if(code == 13) { //Enter keycode
   //Do something
 }

84
if ((e.keyCode || e.which) == 13)? ;)
Kezzer

49
Secondo un commento più in basso in questa pagina, jQuery si normalizza in modo tale che "quale" sia definito ogni volta sull'oggetto evento. Pertanto, la ricerca di "keyCode" non dovrebbe essere necessaria.
Ztyx,

197
Perché l'enorme voto positivo? La domanda è su jQuery, che normalizza queste cose, quindi non c'è bisogno di usare altroe.which , a prescindere dall'evento che si sta utilizzando.
Tim Down

48
@Tim: Ahimè, l'ho appena provato con Firefox usando api.jquery.com/keypress : quando premo <Tab>, e.whichnon è impostato (rimane 0), ma e.keyCodeè ( 9). Vedi stackoverflow.com/questions/4793233/… perché è importante.
Marcel Korpel,

3
@Marcel: Sì, la gestione delle chiavi di jQuery ha carenze e questo è un esempio sfortunato, ma per il tasto Invio, che è ciò di cui si sta ponendo questa domanda, la situazione è estremamente semplice.
Tim Down

133

Prova questo

$('#searchbox input').bind('keypress', function(e) {
    if(e.keyCode==13){
        // Enter pressed... do anything here...
    }
});

5
@VladimirPrudnikov Oh, oh, Ahhhh! Ahh! c'erano i punti di riferimento di Mac a quel link: l'umanità !!!
Ben DeMott,

1
Bene, abbiamo lanciato anche una nuova versione con l'app di Windows. Dai
Vladimir Prudnikov,

2
@VladimirPrudnikov che ne dici di una versione di Linux?
Arda,

@Arda non abbiamo piani per la versione di Linux. Ci saranno un'app Web e un'API pubblica, quindi qualcuno potrebbe crearla :)
Vladimir Prudnikov,

1
Ah ah ah, uno strumento di sviluppo senza piani per Linux. Ricco!
Ziggy,

61

Se si utilizza l'interfaccia utente di jQuery, sono disponibili traduzioni per codici chiave comuni. In ui / ui / ui.core.js :

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

Ci sono anche alcune traduzioni in test / simulate / jquery.simulate.js ma non sono riuscito a trovarne nessuna nella libreria JS principale. Intendiamoci, ho semplicemente inghiottito le fonti. Forse c'è un altro modo per sbarazzarsi di questi numeri magici.

Puoi anche usare String.charCodeAt e .fromCharCode:

>>> String.charCodeAt('\r') == 13
true
>>> String.fromCharCode(13) == '\r'
true

13
La correzione è * $. Ui.keyCode.ENTER ** non * $. KeyCode.ENTER - funziona come un incantesimo anche se grazie per la punta!
daniellmb,

Uncaught TypeError: String.charCodeAt is not a functionPenso che intendevi dire'\r'.charCodeAt(0) == 13
Patrick Roberts,

39

Dato che stai usando jQuery, dovresti assolutamente usare .which. Sì, browser diversi impostano proprietà diverse, ma jQuery li normalizzerà e imposterà il valore. Quale in ciascun caso. Vedi la documentazione su http://api.jquery.com/keydown/ afferma:

Per determinare quale tasto è stato premuto, possiamo esaminare l'oggetto evento che viene passato alla funzione gestore. Mentre i browser utilizzano proprietà diverse per memorizzare queste informazioni, jQuery normalizza la proprietà .which in modo che possiamo usarla in modo affidabile per recuperare il codice chiave.


2
Da quello che ho visto usando event.which e cercando di confrontare con $ .ui.keyCode si ottiene un comportamento incerto. In particolare il tasto [L] minuscolo che mappa a $ .ui.keyCode.NUMPAD_ENTER. Carina.
Danny,

4
Hai una riproduzione che dimostra questo errore? È preferibile segnalarlo ai proprietari di jQuery piuttosto che provare a reimplementare il loro lavoro.
Frank Schwieterman,

31

... questo esempio impedisce l'invio di moduli (regolarmente l'intenzione di base quando si acquisisce la sequenza di tasti # 13):

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

28

modifica: funziona solo per IE ...

Mi rendo conto che si tratta di un vecchio post, ma qualcuno potrebbe trovarlo utile.

Gli eventi chiave sono mappati, quindi invece di utilizzare il valore del codice tasto puoi anche usare il valore chiave per renderlo un po 'più leggibile.

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

Ecco un cheat sheet con le chiavi mappate che ho ottenuto da questo blog inserisci qui la descrizione dell'immagine


5
Non c'è e.keyproprietà.
SLaks

3
Hmm, sembra che sia una proprietà specifica di IE. Funziona con la mia app in IE ma non con Chrome. Immagino che sto usando il codice chiave.
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
Questa è la vera risposta Quello accettato funzionerà per alcune chiavi (come enter) ma fallirà per altre (come supr che verrà scambiato da a.)
Oscar Foley

19
Questo è un incolla diretto dall'origine jQuery ed è il codice che jQuery utilizza per normalizzare la proprietà dell'evento .which.
Ian Clelland,

@Ian Clelland: non riesco a capire il tuo punto, funziona bene o no !? lol
Luca Filosofi,

13
Funziona; Ne sono sicuro, perché jQuery usa esattamente quel codice :) Se hai già jQuery disponibile, usalo e non devi averlo nel tuo codice.
Ian Clelland,

1
@aSeptik: La domanda era "Ho jQuery; come faccio a premere il tasto" - la tua risposta mostra come jQuery lo ottiene in primo luogo. Il mio punto era che poiché jQuery contiene già questa riga di codice, non ne ha bisogno. Può solo usare 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();
    });
});

Spero che questo possa aiutarti !!!


12

Questo è praticamente l'elenco completo dei keyCodes:

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"


6

Ecco una descrizione dettagliata del comportamento di vari browser http://unixpapa.com/js/key.html


2
Questa è assolutamente la pagina che tutti coloro che si muovono in giro a fornire risposte senza speranza dovrebbero leggere.
Tim Down

5

Completerò il codice della soluzione con questa riga e.preventDefault();. In caso di campo di input del modulo non ci occupiamo di inviare su invio premuto

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

4

Aggiungi invio nascosto, non digitare nascosto, basta semplicemente inviare con style = "display: none". Ecco un esempio (rimosso gli attributi non necessari dal codice).

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

accetterà la chiave di immissione in modo nativo, non è necessario JavaScript, funziona in ogni browser.


4

Ecco un'estensione jquery che gestirà il tasto invio premuto.

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

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

Un esempio funzionante può essere trovato qui http://jsfiddle.net/EnjB3/8/


4

Strega;)

/*
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);

Demo: http://jsfiddle.net/molokoloco/hgXyq/24/


4

Uso event.key e JS moderno!

Nessun codice numerico più. Puoi controllare la chiave direttamente. Per esempio "Enter", "LeftArrow", "r", o "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...
    }
});

Mozilla Docs

Browser supportati


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

});

dovresti avere firbug per vedere un risultato nella console


3

Alcuni browser usano keyCode, altri usano quale. Se stai usando jQuery, puoi usare in modo affidabile quale jQuery standardizza le cose. In realtà,

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

    }
});

2

Secondo la risposta di Kilian:

Se è importante solo premere il tasto, è importante:

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

2

Il modo più semplice che faccio è:

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

1
Sarebbe meglio usare al event.whichposto di event.keyCode. Da 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

Ho appena creato un plug-in per jQuery che consente di semplificare keypress eventi . Invece di dover trovare il numero e inserirlo, tutto ciò che devi fare è questo:

Come usarlo

  1. Includi il codice che ho di seguito
  2. Esegui questo codice:
$(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 
    }
});

È così semplice. Si noti che non sitheKeyYouWantToFireAPressEventFor tratta di un numero, ma di una stringa (ad es. Per sparare quando viene premuto, per sparare quando viene premuto o, nel caso di un numero, solo , senza virgolette."a"A"ctrl"CTRL (control)11 viene premuto.)

L'esempio / codice:

Perché la versione lunga è così ... beh ... lunga, ho creato un link PasteBin per questo:
http://pastebin.com/VUaDevz1


Puoi rendere la funzione molto più breve e più veloce se non usi milioni di confronti "if" -> jsfiddle.net/BlaM/bcguctrx - Inoltre, tieni presente che, ad esempio, openbracket e closebracket non sono parentesi aperte / chiuse su un Tastiera tedesca`.
BlaM,

Mi è piaciuta questa soluzione. simpatico.
Jay,


-9

Prova questo:

jQuery('#myInput').keypress(function(e) {
    code = e.keyCode ? e.keyCode : e.which;
    if(code.toString() == 13) {
        alert('You pressed enter!');
    }
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.