2010-10-20 15 views

risposta

45

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, vedere Tim Down's answer (incollare copia che qui come questa risposta sta ancora ricevendo opinioni e upvotes):

Non si può fare questo in modo affidabile con l'evento keyup. Se si desidera conoscere qualcosa sul carattere che è stato digitato, è necessario utilizzare l'evento keynote invece.

Il seguente esempio funzionerà sempre nella maggior parte dei browser ma ci sono alcuni casi limite di cui dovresti essere a conoscenza. Per quello che è in la mia vista 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 vi darà informazioni sulla chiave fisica che è stato premuto. Sulle tastiere standard USA/Regno Unito nei loro layout standard, è come se esistesse una correlazione tra la proprietà keyCode di questi eventi e il carattere che rappresentano. Tuttavia, questo non è affidabile : diversi layout di tastiera avranno mappature diverse.


Quanto segue è stato la risposta originale, ma non è corretto e potrebbe non funzionare in modo affidabile in tutte le situazioni.

per abbinare il codice chiave con un carattere di parola (ad es., a sarebbe partita. space no)

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

Ok, quella era una risposta rapida. L'approccio è lo stesso, ma attenzione ai problemi del codice chiave, vedere questo article in modalità quirks.

+1

Su Firefox keyCode per i tasti F1 e P è lo stesso (anche F2 è 'q', F3 è 'r' ecc.). Su Chromium (browser Webkit) F1 è 'P', F2 è 'Q' ecc. – hluk

+5

Non è possibile ottenere il carattere digitato in modo affidabile dall'evento 'keyup'. Questo potrebbe funzionare sulla tastiera ma per tipi di tastiera e culture diverse non ci sono garanzie. –

+3

Se il punto di @ TimDown non era abbastanza chiaro, eccone un altro: ** questa è fondamentalmente la risposta sbagliata **. – Christian

4

Se avete solo bisogno di escludere fuori enter, escape e spacebar tasti, è possibile effettuare le seguenti operazioni:

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

See it actions here.

È possibile fare riferimento al complete list of keycode here per la vostra ulteriori modifiche.

+2

non tasto Invio o spostare o Esc o lo spazio ... ((((((etc)))))) – faressoft

92

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

L'esempio seguente funzionerà sempre nella maggior parte dei browser, ma ci sono alcuni casi limite da tenere a mente. 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 vi darà informazioni sulla chiave fisica 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.

+0

ho appena incontrato un problema simile, dove non ero * in grado di rilevare e disabilitare il tasto ENTER con 'keyup', ma I * was * in grado di farlo con' keypress'. –

+1

@IanCampbell '' 'keydown''' avrebbe funzionato anche. È perché con '' 'keyup''' il tasto invio è già stato premuto e ricevuto prima che il tasto venga sollevato. –

+0

L'evento keypress non è completamente affidabile. In chrome, se si evidenzia un personaggio e si digita un nuovo carattere su di esso, non viene attivato alcun evento di keypress. – danielson317

4

volevo fare esattamente questo, e ho pensato a una soluzione che comprenda sia il keyup e la pressione del tasto eventi.

(non ho provato in tutti i browser, ma ho usato le informazioni raccolte a http://unixpapa.com/js/key.html)

Edit: 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 (i.e. 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); 
11

questo ha aiutato per me:

$("#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) 
     { ... 
+0

Funziona anche con copia/incolla CTRL + C/CTRL + V. Condizione molto semplice: 'String.fromCharCode (e.keyCode) .match (/ \ w /) || e.keyCode === 8 || e.keyCode === 46' – fabdouglas

+0

Piccolo bug qui. Stai usando 'String.fromCharCode', ma inserendo' event.keyCode'. Dovrebbe essere 'event.charCode'. Tuttavia, 'event.charCode' è sempre 0 per l'evento keyUp (in Chrome, almeno). Questa risposta è difettosa. Se controlli la variabile 'c' vedrai che non equivale al tasto premuto. – HankScorpio

6

io non sono totalmente soddisfatto con le altre risposte date. Hanno tutti una specie di difetto per loro.

L'utilizzo di keyPress con event.which non è affidabile perché non è possibile catturare un backspace o un'eliminazione (come indicato da Tarl). L'utilizzo di keyDown (come nelle risposte di Niva e Tarl) è un po 'meglio, ma la soluzione è difettosa perché tenta di utilizzare event.keyCode con String.fromCharCode() (keyCode e charCode non sono la stessa cosa!).

Tuttavia, ciò che si ottiene con l'evento keydown o keyup è il tasto effettivo premuto (event.key). Per quanto posso dire, qualsiasi key con una lunghezza pari a 1 è un carattere (numero o lettera) indipendentemente dalla tastiera della lingua che si sta utilizzando. Per favore correggimi se questo non è vero!

Quindi c'è una 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: o keyup o keydown funzionerà qui, ma non lo farà keypress)

$("input").keydown(function(e) { 

    var isWordCharacter = event.key.length === 1; 
    var isBackspaceOrDelete = (event.keyCode == 8 || event.keyCode == 46); 

    if (isWordCharacter || isBackspaceOrDelete) { 

    } 
}); 
+3

Non ho davvero apprezzato questa risposta quando l'ho letta per la prima volta, ma poi ho provato e funziona meravigliosamente. – gdpelican

Problemi correlati