2013-03-30 11 views
6

Nella mia pagina HTML c'è un campo di testo di input. Voglio inserire solo la chiave numerica e la freccia sinistra/destra sulla tastiera. Ho provato il seguente codice JavaScript ma ho riscontrato un problema.problema keyCode - Impossibile impedire l'immissione del carattere%

<input onkeypress="return allowNumberOnly(event)" /> 

function allowNumberOnly(event) { 
    event = event || window.event; 
    var charCode = (event.which) ? event.which : event.keyCode; 

    //keyCode 48-57 represent the number 0-9 
    //keyCode 37,39 represent the Left and Right arrow 
    //keyCode 46 represent the Delete key 
    //keyCode 8 represent the Backspace key 

    return charCode == 37 || charCode == 39 || charCode == 46 || charCode == 8 
       || (charCode >= 48 && charCode <= 57); 
} 

Dopo aver testato questo codice, ho trovato un problema che il keyCode della freccia sinistra e% carattere speciale sono entrambi 37. Quindi non posso impedire all'utente di entrare carattere% frattempo permettendo la freccia sinistra. Non ho idea del perché questo accada. Ho sempre pensato che il codice chiave dovesse essere unico per ogni tasto della tastiera. Ho pensato di usare onkeyup invece di onkeypress. Ma l'onkeyup consentirebbe all'utente di inserire prima il carattere non valido, quindi rimuovere dal testo di input. Questo comportamento non è quello che voglio. Qualsiasi suggerimento sarebbe apprezzato.

Ho eseguito il debug del codice in FireFox e ho trovato la seguente differenza.

1. Se entra%, event.which == 37 e event.keyCode == 0
2. Se entra Freccia sinistra, event.which == 0 e event.keyCode == 37

Il problema sembra essere risolto utilizzando questa differenza. Continuerò a provare in IE e Chrome.

+3

Fiddle: http://jsfiddle.net/gW6k3/ – JJJ

risposta

1

controllo risposta Bryant Williams' a questa domanda:

how can i track arrow keys in Chrome and IE?

Egli suggerisce di controllare se il charCode == 0, o il controllo per il tasto Shift è premuto.

+0

@Nile Aggiungendo event.shiftKey == false non si esclude il carattere%, ma mi impedisce anche di inserire la combinazione di tasti Maiusc + Sinistra. Mi piacerebbe usare questo tasto di combinazione per selezionare il contenuto nel campo di testo di input. – kimi

1

sono arrivato fino a questo a while ago:

var numbersOnly = function(e){ 
    var charCode = (typeof e.which === "number") ? e.which : e.keyCode, 
     chr = String.fromCharCode(charCode); //convert it to a character 

    if(isNaN(parseInt(chr, 10))) e.preventDefault(); 
} 

Usage:

<input type="text" name="phoneNumber" onkeypress="numbersOnly(event);"> 

Fondamentalmente quello che stiamo facendo qui è ottenere il codice chiave utilizzata, la conversione che al suo codice char equivalente, e quindi testare il codice char al posto del codice chiave. Trovo che questo metodo funzioni molto meglio di qualsiasi altro che ho incontrato e funziona molto bene.

JS Bin Example.

+0

Il PO vuole anche consentire '' <' and '> chiavi (da qui il problema con ''%). –

+0

@JaredFarrish Ah, vedi in Chrome i tasti freccia hanno funzionato, anche se testandolo in Fx vedo che non lo fanno. – jeremy

+0

Sospetto che sia perché Firefox vede '<' e '%' come [capovolto '.keyCode' e' .charCode'] (http://jsfiddle.net/userdude/mvJD5/1/). Chrome sembra ignorare le pressioni '<. –

2

Questo collegamento ha più informazioni sugli eventi di tastiera

http://unixpapa.com/js/key.html

Inoltre ho fatto la versione jQuery

$('input').keypress(function(e){ 

    var code = e.which || e.keyCode ; 

    if (!(e.shiftKey == false && 
      (
       code == 46 || 
       code == 8 || 
       code == 37 || 
       code == 39 || 
       (code >= 48 && code <= 57) 
      ) 
     ) 
    ){ 

     e.preventDefault();     
    } 

}); 

controllare su http://jsfiddle.net/UGpUJ/

+0

Non penso che la pubblicazione di un singolo collegamento a informazioni generali sul problema sia una risposta adeguata. –

+0

@CiananSims Ho creato una soluzione jQuery. Si prega di controllare la risposta aggiornata! – rab

+0

Ha funzionato come un incanto grazie! –

Problemi correlati