Come sapere se .keyup () è una chiave di carattere (jQuery)

Come sapere se .keyup () è una chiave di carattere (jQuery)

$("input").keyup(function() { if (key is a character) { //such as ab A bc 5 3 2 $ # ^ ! ^ * # ...etc not enter key or shift or Esc or space ...etc /* Do stuff */ } }); 

Nota: Con il senno di poi, questa è stata una risposta rapida e sporca e potrebbe non funzionare in tutte le situazioni. Per avere una soluzione affidabile, vedi la risposta di Tim Down (copia qui incollando che questa risposta sta ancora ottenendo visualizzazioni e upvotes):

Non è ansible farlo in modo affidabile con l’evento keyup. Se vuoi sapere qualcosa sul personaggio che è stato digitato, devi usare invece l’evento keypress.

Il seguente esempio funzionerà sempre nella maggior parte dei browser, ma ci sono alcuni casi limite che dovresti conoscere. Per quello che è a mio avviso la guida definitiva su questo, vedi http://unixpapa.com/js/key.html .

 $("input").keypress(function(e) { if (e.which !== 0) { alert("Charcter was typed. It was: " + String.fromCharCode(e.which)); } }); 

keyup e keydown ti danno informazioni sul tasto fisico che è stato premuto. Sulle tastiere standard USA / Regno Unito nei loro layout standard, sembra che esista una correlazione tra la proprietà keyCode di questi eventi e il carattere che rappresentano. Tuttavia, questo non è affidabile: diversi layout di tastiera avranno mappature differenti.


La seguente è stata la risposta originale, ma non è corretta e potrebbe non funzionare in modo affidabile in tutte le situazioni.

Per abbinare il codice di accesso con un carattere di parola (ad es.

 $("input").keyup(function(event) { var c= String.fromCharCode(event.keyCode); var isWordcharacter = c.match(/\w/); }); 

Ok, questa è stata una rapida risposta. L’approccio è lo stesso, ma fai attenzione ai problemi relativi ai keycode, consulta questo articolo in Quirksmode.

Non è ansible farlo in modo affidabile con l’evento keyup . Se vuoi sapere qualcosa sul personaggio che è stato digitato, devi usare invece l’evento keypress .

Il seguente esempio funzionerà sempre nella maggior parte dei browser, ma ci sono alcuni casi limite che dovresti conoscere. Per quello che è a mio avviso la guida definitiva su questo, vedi http://unixpapa.com/js/key.html .

 $("input").keypress(function(e) { if (e.which !== 0) { alert("Charcter was typed. It was: " + String.fromCharCode(e.which)); } }); 

keyup e keydown ti danno informazioni sul tasto fisico che è stato premuto. Sulle tastiere standard USA / Regno Unito nei loro layout standard, sembra che esista una correlazione tra la proprietà keyCode di questi eventi e il carattere che rappresentano. Tuttavia, questo non è affidabile: diversi layout di tastiera avranno mappature differenti.

Questo mi ha aiutato:

 $("#input").keyup(function(event) { //use keyup instead keypress because: //- keypress will not work on backspace and delete //- keypress is called before the character is added to the textfield (at least in google chrome) var searchText = $.trim($("#input").val()); var c= String.fromCharCode(event.keyCode); var isWordCharacter = c.match(/\w/); var isBackspaceOrDelete = (event.keyCode == 8 || event.keyCode == 46); // trigger only on word characters, backspace or delete and an entry size of at least 3 characters if((isWordCharacter || isBackspaceOrDelete) && searchText.length > 2) { ... 

Non sono completamente soddisfatto delle altre risposte fornite. Hanno tutti una specie di difetto per loro.

Usando keyPress con event.which non è affidabile perché non puoi catturare un backspace o un delete (come citato da Tarl). Usare keyDown (come nelle risposte di Niva e Tarl) è un po ‘meglio, ma la soluzione è difettosa perché tenta di usare event.keyCode con String.fromCharCode() (keyCode e charCode non sono la stessa cosa!).

Tuttavia, ciò che abbiamo con il keydown o l’evento keyup è la chiave effettiva che è stata premuta ( event.key ). Per quanto ne so, ogni key con una lunghezza di 1 è un carattere (numero o lettera) indipendentemente dalla tastiera della lingua che stai usando. Per favore correggimi se questo non è vero!

Poi c’è quella risposta molto lunga da asdf. Potrebbe funzionare perfettamente, ma sembra eccessivo.


Quindi ecco una soluzione semplice che catturerà tutti i caratteri, il backspace e l’eliminazione. (Nota: keyup o keydown funzioneranno qui, ma keypress non lo farà)

 $("input").keydown(function(e) { var isWordCharacter = event.key.length === 1; var isBackspaceOrDelete = (event.keyCode == 8 || event.keyCode == 46); if (isWordCharacter || isBackspaceOrDelete) { } }); 

Se hai solo bisogno di escludere le chiavi enter , escape e spacebar , puoi fare quanto segue:

 $("#text1").keyup(function(event) { if (event.keyCode != '13' && event.keyCode != '27' && event.keyCode != '32') { alert('test'); } }); 

Guardalo azioni qui.

È ansible fare riferimento all’elenco completo del codice di accesso qui per ulteriori modifiche.

Volevo fare esattamente questo, e ho pensato ad una soluzione che coinvolgesse sia la keyup che gli eventi keypress .

(Non l’ho provato su tutti i browser, ma ho usato le informazioni compilate su http://unixpapa.com/js/key.html )

Modifica: riscritto come plugin jQuery.

 (function($) { $.fn.normalkeypress = function(onNormal, onSpecial) { this.bind('keydown keypress keyup', (function() { var keyDown = {}, // keep track of which buttons have been pressed lastKeyDown; return function(event) { if (event.type == 'keydown') { keyDown[lastKeyDown = event.keyCode] = false; return; } if (event.type == 'keypress') { keyDown[lastKeyDown] = event; // this keydown also triggered a keypress return; } // 'keyup' event var keyPress = keyDown[event.keyCode]; if ( keyPress && ( ( ( keyPress.which >= 32 // not a control character //|| keyPress.which == 8 || // \b //|| keyPress.which == 9 || // \t //|| keyPress.which == 10 || // \n //|| keyPress.which == 13 // \r ) && !( keyPress.which >= 63232 && keyPress.which <= 63247 ) && // not special character in WebKit < 525 !( keyPress.which == 63273 ) && // !( keyPress.which >= 63275 && keyPress.which <= 63277 ) && // !( keyPress.which === event.keyCode && // not End / Home / Insert / Delete (ie in Opera < 10.50) ( keyPress.which == 35 || // End keyPress.which == 36 || // Home keyPress.which == 45 || // Insert keyPress.which == 46 || // Delete keyPress.which == 144 // Num Lock ) ) ) || keyPress.which === undefined // normal character in IE < 9.0 ) && keyPress.charCode !== 0 // not special character in Konqueror 4.3 ) { // Normal character if (onNormal) onNormal.call(this, keyPress, event); } else { // Special character if (onSpecial) onSpecial.call(this, event); } delete keyDown[event.keyCode]; }; })()); }; })(jQuery);