2009-12-11 20 views
6

Sono impegnato sull'evento keydown con jQuery per consentire alcuni caratteri specifici in una casella di testo. Sto cercando di rendere il mio codice conforme al browser e alla piattaforma. Il mio problema principale è che non riesco a trovare un modo per mappare il codice chiave ricevuto su un codice char valido, in particolare per il codice chiave proveniente dal pad numerico (separatore decimale, è un coma o un punto, ecc.).codice chiave JavaScript =/= codice char

Grazie in anticipo per l'aiuto, Fabian

risposta

1

Beh, come ho detto nei commenti, l'obiettivo dietro questa domanda è stato quello di filtrare una casella di testo in valori numerici. Sono riuscito a raggiungere il mio obiettivo utilizzando l'evento keypress.

Ho pubblicato un jQuery plug-in per coloro che sono interessati alla soluzione.

6

Questo è corretto. Non esiste una mappatura del genere che tu possa fare; a keydown potrebbe non corrispondere nemmeno a un carattere inserito. O Caps Lock potrebbe cambiare il significato del tasto di pressione, e non puoi annusarlo per quello. E various other wrinkles.

Se volete conoscere il codice di carattere l'unica opzione è quella di utilizzare l'evento keypress.

+0

Questa è anche la mia conclusione. Ma, secondo http://www.quirksmode.org/js/keys.html, sembra che Firefox non gestisca correttamente l'evento keypress. Sono un po 'bloccato su questo tema: -/ –

+0

Un'altra cosa su pressione di un tasto, ottengo lo stesso codice per il periodo e il tasto di cancellazione (non backspace): 46. Questo è un problema enorme per me :( Utilizzando italiano Windows XP, inglese Firefox, tastiera belga, mappatura belga –

+3

La pressione di un tasto di Firefox va bene, basta usare il solito 'event.which' per ottenere il carattere, quindi aggiungere il fallback per il comportamento di charCode-in-keyCode di IE. = 'which' in event? event.which: event.keyCode; ' – bobince

1

Beh, se il vostro problema è la traduzione dei codici dei tasti a personaggi, perché non lasciare che gestisce il browser per voi? Questo potrebbe sembrare orribile, ma potresti semplicemente consentire al browser di modificare la casella di testo (in modo che l'eliminazione sia un'eliminazione e un punto sia un punto), quindi tornare indietro e modificarlo ... Ehm ... forse qualcosa del genere :

function hookEvents() { 
    $('#myTextBox').oldValue = $('#myTextBox').value; 
    $('#myTextBox').bind('keyup', function(event) { 
     // Maybe nothing's changed? 
     if (event.target.oldValue == event.target.value) { 
      return; 
     } 

     var validInput = /(\-?[0-9]*(?:\.[0-9]*)?)/; 
     var input = event.target.value; 
     var result = validInput.exec(input); 
     if (result.index != 0 || result[result.length-1] != input.length) 
     { 
      event.target.value = result[0]; 
     } 

     // update for later 
     event.target.oldValue = event.target.value; 
    }); 
} 

Il problema più grande con questo approccio è che ogni tasto premuto appare sullo schermo per un momento. D'altra parte, con REGEX hai molto più controllo sul formato dell'input consentito. Nell'esempio sopra, permetto solo numeri positivi o negativi (con un punto decimale opzionale). Ad esempio: "123", "-123", "-123.456", "123.456".

So che questo in realtà non rispondere alla tua domanda, ma elude la questione del tutto!

+0

Interessante, ma come hai detto, il personaggio verrà prima appaiato sulla casella di testo. Questo è qualcosa che non voglio avere. –