jQuery: qual è il modo migliore per limitare l'input "numerico" solo per le caselle di testo? (consenti punti decimali)


228

Qual è il modo migliore per limitare l'input "numerico" solo per le caselle di testo?

Sto cercando qualcosa che consenta punti decimali.

Vedo molti esempi. Ma devi ancora decidere quale usare.

Aggiornamento da Praveen Jeganathan

Niente più plugin, jQuery ha implementato il proprio jQuery.isNumeric()aggiunto in v1.7. Vedi: https://stackoverflow.com/a/20186188/66767


3
Questa è una domanda basata sull'opinione, ma molto utile. Le domande basate sull'opinione dovrebbero essere consentite. La persona che sta cercando queste informazioni deve solo essere consapevole che si tratta solo di risposte basate sull'opinione. Un TAG sarebbe sufficiente.
Thiago C. S Ventura,

ecco un bell'articolo con demo live codepedia.info/…
Satinder singh,

Risposte:


198

Aggiornare

Esiste una soluzione nuova e molto semplice per questo:

Ti consente di utilizzare qualsiasi tipo di filtro di input su un testo <input>, inclusi vari filtri numerici. Questo gestirà correttamente Copia + Incolla, Trascina + Rilascia, scorciatoie da tastiera, operazioni del menu contestuale, tasti non tipizzabili e tutti i layout di tastiera.

Vedi questa risposta o provala tu stesso su JSFiddle .

plugin jquery.numeric

Ho implementato con successo molti moduli con il plugin jquery.numeric .

$(document).ready(function(){
    $(".numeric").numeric();
});

Inoltre funziona anche con textareas!

Tuttavia, tieni presente che Ctrl + A, Copia + Incolla (tramite il menu contestuale) e Trascina + Rilascia non funzioneranno come previsto.

HTML 5

Con un supporto più ampio per lo standard HTML 5, possiamo usare l' patternattributo e il numbertipo per gli inputelementi per limitare l'input solo numerico. In alcuni browser (in particolare Google Chrome), funziona anche per limitare l'incollamento di contenuti non numerici. Maggiori informazioni su numbere altri tipi di input più recenti sono disponibili qui .


5
Questo plugin non ti consente di utilizzare il backspace in Opera.
Darryl Hein,

6
@Darryl la fonte è lunga solo poche decine di righe, quindi sono sicuro che la modifica per consentire che sia banale. Ho appena trovato questo plugin e l'ho modificato in modo che ora ci sia allowDecimalun'opzione ogni volta che voglio solo consentire valori interi .. la fonte è molto semplice e ben scritta.
Earlz,

1
Questo non funziona quando si incolla copia nei campi di input che sono di type="number".
Tallmaris,

@Tallmaris questa è davvero una domanda e risposta molto antica. Ci sono state molte modifiche all'HTML e dovrebbero essere prese in considerazione.
TheVillageIdiot

Ciao @TheVillageIdiot, hai ragione. Non volevo sembrare maleducato nel commento (che è probabilmente un po 'secco) :) Il fatto è che ho visto alcuni commenti recenti, quindi volevo solo chiarire che questa, al momento, non è probabilmente la soluzione migliore per problema.
Tallmaris,

288

Se si desidera limitare l'input (anziché la convalida), è possibile lavorare con gli eventi chiave. qualcosa come questo:

<input type="text" class="numbersOnly" value="" />

E:

jQuery('.numbersOnly').keyup(function () { 
    this.value = this.value.replace(/[^0-9\.]/g,'');
});

Questo fa immediatamente sapere all'utente che non possono inserire caratteri alfa, ecc. Piuttosto che successivamente durante la fase di validazione.

Avrai comunque bisogno di convalidare perché l'input potrebbe essere compilato tagliando e incollando con il mouse o eventualmente da un modulo autocompleter che potrebbe non attivare gli eventi chiave.


4
+1 - Stavo per suggerire la stessa cosa. È un ottimo punto per notare che questa forma di convalida può avvenire per sequenza di tasti, piuttosto che una volta alla fine. L'unica cosa che aggiungerei è una forma di avviso che viene rifiutato ciò che l'utente sta digitando. Semplicemente non mostrare le lettere farà pensare a troppe persone che la loro tastiera sia rotta. forse cambiare leggermente il colore dello sfondo o del bordo .. purché l'utente sappia che la tua app sta effettivamente facendo qualcosa.
Nickf,

concordato. ho un esempio su tarbuilders.com . se fai clic su "contatta", il modulo controlla al volo l'input dell'utente e, se è valido, c'è un bordo verde e un segno di spunta. non valido -> rosso e "x"
Keith Bentrup,

5
Vedi questa risposta per risolvere il problema con il tasto freccia.
Hanna,

Si noti che è ancora possibile incollare caratteri e lettere con il tasto destro del mouse fare clic su> incolla. Un modo semplice per risolvere questo sarebbe:$doc.on('keyup blur input propertychange', 'input[name="price"]', function(){$(this).val($(this).val().replace(/[^0-9\.]/g,''));});
Rens Tillmann,

1
CRAP, se scrivo i numeri cioè "123", e quindi premo un tasto lettera, cioè "a", svuota l'input ...
candlejack

102

Ho pensato che la migliore risposta fosse quella sopra per fare proprio questo.

jQuery('.numbersOnly').keyup(function () {  
    this.value = this.value.replace(/[^0-9\.]/g,''); 
});

ma concordo sul fatto che è un po 'doloroso che i tasti freccia e il pulsante Elimina facciano scattare il cursore alla fine della stringa (e per questo motivo è stato restituito a me durante i test)

Ho aggiunto una semplice modifica

$('.numbersOnly').keyup(function () {
    if (this.value != this.value.replace(/[^0-9\.]/g, '')) {
       this.value = this.value.replace(/[^0-9\.]/g, '');
    }
});

in questo modo se viene premuto un pulsante che non causerà la modifica del testo, ignoralo. Con questo puoi colpire le frecce ed eliminare senza saltare fino alla fine ma cancella qualsiasi testo non numerico.


27
Per prestazioni migliori, creare un var con risultato di sostituzione anziché eseguirlo due volte.
DriverDan

4
keypresspotrebbe essere usato per semplificare ulteriormente questo, perché apparentemente keyupe si keydownattiva su qualsiasi tasto della tastiera, mentre keypress si innesca solo sui tasti "carattere" (quindi non si innesca sulla freccia e cancella i tasti). Vedere questa risposta per riferimento: stackoverflow.com/a/1367720/1298685
Ian Campbell

Sta accettando più di un decimale. Come accettare solo un decimale. Ho richiesto il campo di testo importo. Ci vogliono anche 12.5.6. Come limitare per un punto.
niru dyogi,

La pressione del tasto @IanCampbell significa che è possibile inserire un carattere per cominciare che non viene rimosso. Non funzionerà Keydown fa la stessa cosa. Posso solo farlo funzionare con il keyup.
Nickdnk,

54

Il plugin jquery.numeric ha alcuni bug di cui ho informato l'autore. Consente più punti decimali in Safari e Opera e non è possibile digitare backspace, tasti freccia o diversi altri caratteri di controllo in Opera. Avevo bisogno di un input intero positivo e alla fine ho finito per scrivere il mio.

$(".numeric").keypress(function(event) {
  // Backspace, tab, enter, end, home, left, right
  // We don't support the del key in Opera because del == . == 46.
  var controlKeys = [8, 9, 13, 35, 36, 37, 39];
  // IE doesn't support indexOf
  var isControlKey = controlKeys.join(",").match(new RegExp(event.which));
  // Some browsers just don't raise events for control keys. Easy.
  // e.g. Safari backspace.
  if (!event.which || // Control keys in most browsers. e.g. Firefox tab is 0
      (49 <= event.which && event.which <= 57) || // Always 1 through 9
      (48 == event.which && $(this).attr("value")) || // No 0 first digit
      isControlKey) { // Opera assigns values for control keys.
    return;
  } else {
    event.preventDefault();
  }
});

Non è possibile inserire uno 0 utilizzando questo codice. Testato con Chrome e FF su Mac.
Jaredstenquist,

1
Ho aggiornato questo per accettare 0 cifre (48 == event.which && ($ (this) .val ()> 0)) || // n. 0 prima cifra
aljordan82

Questa è un'ottima soluzione ma mancano i decimali, basta aggiungere (46 == event.which &&! ($ (This) .val (). Includes ("."))) ||
DiamondDrake,

Non riesco a digitare 0.
PJ7,

47

Niente più plugin, jQuery ha implementato il proprio jQuery.isNumeric () aggiunto nella v1.7.

jQuery.isNumeric( value )

Determina se il suo argomento è un numero.

Risultati dei campioni

$.isNumeric( "-10" );     // true
$.isNumeric( 16 );        // true
$.isNumeric( 0xFF );      // true
$.isNumeric( "0xFF" );    // true
$.isNumeric( "8e5" );     // true (exponential notation string)
$.isNumeric( 3.1415 );    // true
$.isNumeric( +10 );       // true
$.isNumeric( 0144 );      // true (octal integer literal)
$.isNumeric( "" );        // false
$.isNumeric({});          // false (empty object)
$.isNumeric( NaN );       // false
$.isNumeric( null );      // false
$.isNumeric( true );      // false
$.isNumeric( Infinity );  // false
$.isNumeric( undefined ); // false

Ecco un esempio di come legare isNumeric () con il listener di eventi

$(document).on('keyup', '.numeric-only', function(event) {
   var v = this.value;
   if($.isNumeric(v) === false) {
        //chop off the last char entered
        this.value = this.value.slice(0,-1);
   }
});

+1 per nessun plugin. Vorrei aggiungere una leggera modifica per consentire migliaia di separatori. Al posto di var v = this.value;cambiarlo in var v = this.value.replace(/,/g,'');. Numeri come 21,345,67.800sono troppo considerati.
maan81,

Qualcuno sa come questo controlla i numeri? Utilizza codici chiave o espressioni regolari? Importante se si considerano layout di tastiera diversi.
Christopher Grigg,

2
Questo è molto vicino. Tuttavia, se si tiene premuto un tasto carattere, il controllo non viene eseguito correttamente. Il personaggio "scapperà". Invece prova questo: $(document).on('keyup keypress', '#somethingSomething', function(){ var aValue = $(this).val(); if($.isNumeric(aValue) === false){ $(this).val(aValue.slice(0,-1)); } });
Gwi7d31

34

Il plug-in numerico () menzionato sopra, non funziona in Opera (non è possibile eseguire il backspace, eliminare o persino utilizzare i tasti indietro o avanti).

Il codice seguente in JQuery o Javascript funzionerà perfettamente (ed è solo due righe).

JQuery:

$(document).ready(function() {
    $('.key-numeric').keypress(function(e) {
            var verified = (e.which == 8 || e.which == undefined || e.which == 0) ? null : String.fromCharCode(e.which).match(/[^0-9]/);
            if (verified) {e.preventDefault();}
    });
});

Javascript:

function isNumeric(e)
{
    var keynum = (!window.event) ? e.which : e.keyCode;
    return !((keynum == 8 || keynum == undefined || e.which == 0) ? null : String.fromCharCode(keynum).match(/[^0-9]/));
}

Naturalmente questo è solo per input numerici puri (più backspace, cancella, tasti avanti / indietro) ma può essere facilmente modificato per includere punti e meno caratteri.


anche il tastierino numerico non è consentito
Graham,


18

Non è necessario il codice lungo per la limitazione dell'input numerico, prova questo codice.

Accetta anche int e float validi entrambi i valori.

Approccio Javascript

onload =function(){ 
  var ele = document.querySelectorAll('.number-only')[0];
  ele.onkeypress = function(e) {
     if(isNaN(this.value+""+String.fromCharCode(e.charCode)))
        return false;
  }
  ele.onpaste = function(e){
     e.preventDefault();
  }
}
<p> Input box that accepts only valid int and float values.</p>
<input class="number-only" type=text />

Approccio jQuery

$(function(){

  $('.number-only').keypress(function(e) {
	if(isNaN(this.value+""+String.fromCharCode(e.charCode))) return false;
  })
  .on("cut copy paste",function(e){
	e.preventDefault();
  });

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p> Input box that accepts only valid int and float values.</p>
<input class="number-only" type=text />

AGGIORNARE

Le risposte di cui sopra sono per il caso d'uso più comune: convalida dell'input come numero.

Ma di seguito è riportato lo snippet di codice per casi d'uso speciali

  • Consentire numeri negativi
  • Mostra la sequenza di tasti non valida prima di rimuoverla.

$(function(){
      
  $('.number-only').keyup(function(e) {
        if(this.value!='-')
          while(isNaN(this.value))
            this.value = this.value.split('').reverse().join('').replace(/[\D]/i,'')
                                   .split('').reverse().join('');
    })
    .on("cut copy paste",function(e){
    	e.preventDefault();
    });

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p> Input box that accepts only valid int and float values.</p>
<input class="number-only" type=text />


14

Di seguito è quello che uso per bloccare letteralmente i tasti. Ciò consente solo numeri 0-9 e un punto decimale. Facile da implementare, non molto codice e funziona come un incantesimo:

<script>
function isNumberKey(evt) {
    var charCode = (evt.which) ? evt.which : event.keyCode;
    if (charCode != 46 && charCode > 31 && (charCode < 48 || charCode > 57)) {
        return false;
    } else {
        return true;
    }      
}
</script>

<input value="" onkeypress="return isNumberKey(event)">

Se qualcuno si sta chiedendo, puoi limitare i decimali rimuovendo dall'istruzione charCode != 46if. Bella risposta!
Gaʀʀʏ

Esattamente, ho rimosso il charCode! = 46 per saltare i decimali. Grazie Kaleazy, questa risposta ha funzionato perfettamente per me.
msqar

3
Questa è una cattiva soluzione perché non tiene conto di backspace, frecce, tasti di controllo e altri tasti necessari.
DriverDan

Ho appena pubblicato una soluzione simile a questa, ma gestisce anche backspace, frecce e non utilizza codici chiave codificati. Dai un'occhiata qui: stackoverflow.com/a/23468513/838608
Håvard Geithus,


9

Non vedi alfabeti aspetto magico e scomparsa sulla chiave in basso. Funziona anche con il mouse paste.

$('#txtInt').bind('input propertychange', function () {
    $(this).val($(this).val().replace(/[^0-9]/g, ''));
});

Pur non consentendo i decimali, ho scoperto che questo è il metodo più semplice per gli interi.
Nickdnk,

Per i decimali, potresti probabilmente aggiornare la regex a qualcosa del genere/[^0-9.]/g
Null Head,

Non ho bisogno di decimali. Fu solo perché OP lo fece, ma sì :)
Nickdnk,

8

Ho provato a risolverlo per la prima volta usando jQuery, ma non ero contento che i caratteri indesiderati (non cifre) apparissero nel campo di input prima di essere rimossi al keyup.

Alla ricerca di altre soluzioni ho trovato questo:

Numeri interi (non negativi)

<script>
  function numbersOnly(oToCheckField, oKeyEvent) {
    return oKeyEvent.charCode === 0 ||
        /\d/.test(String.fromCharCode(oKeyEvent.charCode));
  }
</script>

<form name="myForm">
<p>Enter numbers only: <input type="text" name="myInput" 
    onkeypress="return numbersOnly(this, event);" 
    onpaste="return false;" /></p>
</form>

Fonte: https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers.onkeypress#Example Esempio live: http://jsfiddle.net/u8sZq/

Punti decimali (non negativi)

Per consentire un singolo punto decimale potresti fare qualcosa del genere:

<script>
  function numbersOnly(oToCheckField, oKeyEvent) {        
    var s = String.fromCharCode(oKeyEvent.charCode);
    var containsDecimalPoint = /\./.test(oToCheckField.value);
    return oKeyEvent.charCode === 0 || /\d/.test(s) || 
        /\./.test(s) && !containsDecimalPoint;
  }
</script>

Fonte: ho appena scritto questo. Sembra funzionare. Esempio live: http://jsfiddle.net/tjBsF/

Altre personalizzazioni

  • Per consentire la digitazione di più simboli, basta aggiungerli all'espressione regolare che funge da filtro di base del codice char.
  • Per implementare semplici restrizioni contestuali, guarda il contenuto corrente (stato) del campo di input (oToCheckField.value)

Alcune cose che potresti essere interessato a fare:

  • È consentito solo un punto decimale
  • Consenti il ​​segno meno solo se posizionato all'inizio della stringa. Ciò consentirebbe numeri negativi.

carenze

  • La posizione del cursore non è disponibile all'interno della funzione. Ciò ha notevolmente ridotto le restrizioni contestuali che è possibile implementare (ad esempio, non esistono due simboli consecutivi uguali). Non sono sicuro di quale sia il modo migliore per accedervi.

So che il titolo richiede soluzioni jQuery, ma spero che qualcuno lo troverà comunque utile.


6

Grazie per il post Dave Aaron Smith

Ho modificato la tua risposta per accettare il punto decimale e i numeri dalla sezione dei numeri. Questo lavoro è perfetto per me.

$(".numeric").keypress(function(event) {
  // Backspace, tab, enter, end, home, left, right,decimal(.)in number part, decimal(.) in alphabet
  // We don't support the del key in Opera because del == . == 46.
  var controlKeys = [8, 9, 13, 35, 36, 37, 39,110,190];
  // IE doesn't support indexOf
  var isControlKey = controlKeys.join(",").match(new RegExp(event.which));
  // Some browsers just don't raise events for control keys. Easy.
  // e.g. Safari backspace.
  if (!event.which || // Control keys in most browsers. e.g. Firefox tab is 0
      (49 <= event.which && event.which <= 57) || // Always 1 through 9
      (96 <= event.which && event.which <= 106) || // Always 1 through 9 from number section 
      (48 == event.which && $(this).attr("value")) || // No 0 first digit
      (96 == event.which && $(this).attr("value")) || // No 0 first digit from number section
      isControlKey) { // Opera assigns values for control keys.
    return;
  } else {
    event.preventDefault();
  }
});

6
   window.jQuery.fn.ForceNumericOnly =
       function () {

           return this.each(function () {
               $(this).keydown(function (event) {
                   // Allow: backspace, delete, tab, escape, and enter
                   if (event.keyCode == 46 || event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 27 || event.keyCode == 13 ||
                       // Allow: Ctrl+A
                       (event.keyCode == 65 && event.ctrlKey === true) ||
                       // Allow: home, end, left, right
                       (event.keyCode >= 35 && event.keyCode <= 39)) {
                       // let it happen, don't do anything
                       return;
                   } else {
                       // Ensure that it is a number and stop the keypress
                       if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) {
                           event.preventDefault();
                       }
                   }
               });
           });
       };

E applicalo su tutti gli input che desideri:

$('selector').ForceNumericOnly();

5

HTML5 supporta il numero del tipo di input con supporto browser globale 88% + secondo CanIUse a partire da ottobre 2015.

<input type="number" step="0.01" min="0" name="askedPrice" id="askedPrice" />

Questa non è una soluzione correlata a JQuery, ma il vantaggio è che sui telefoni cellulari la tastiera Android sarà ottimizzata per l'immissione dei numeri.

In alternativa, è possibile utilizzare il testo del tipo di input con il nuovo parametro "modello". Maggiori dettagli nelle specifiche HTML5.

Penso che sia meglio della soluzione jquery, poiché in questa domanda a condizione che la soluzione jquery non supporti migliaia di separatori. Se puoi usare html5.

JSFiddle: https://jsfiddle.net/p1ue8qxj/


4

Questa funzione fa la stessa cosa, usa alcune delle idee sopra.

$field.keyup(function(){
    var val = $j(this).val();
    if(isNaN(val)){
         val = val.replace(/[^0-9\.]/g,'');
         if(val.split('.').length>2) val =val.replace(/\.+$/,"");
    }
    $j(this).val(val); 
});
  • mostra feedback visivo (prima che scompaia appare una lettera errata)
  • consente decimali
  • cattura più "."
  • non ha problemi con il tasto sinistra / destra ecc.

4

/ * questa è la mia versione cross-browser di Come consentire solo numeri (0-9) nella casella di input HTML usando jQuery?
* /

$("#inputPrice").keydown(function(e){
    var keyPressed;
    if (!e) var e = window.event;
    if (e.keyCode) keyPressed = e.keyCode;
    else if (e.which) keyPressed = e.which;
    var hasDecimalPoint = (($(this).val().split('.').length-1)>0);
    if ( keyPressed == 46 || keyPressed == 8 ||((keyPressed == 190||keyPressed == 110)&&(!hasDecimalPoint && !e.shiftKey)) || keyPressed == 9 || keyPressed == 27 || keyPressed == 13 ||
             // Allow: Ctrl+A
            (keyPressed == 65 && e.ctrlKey === true) ||
             // Allow: home, end, left, right
            (keyPressed >= 35 && keyPressed <= 39)) {
                 // let it happen, don't do anything
                 return;
        }
        else {
            // Ensure that it is a number and stop the keypress
            if (e.shiftKey || (keyPressed < 48 || keyPressed > 57) && (keyPressed < 96 || keyPressed > 105 )) {
                e.preventDefault();
            }
        }

  });


3

Puoi usare autoNumeric da decorplanit.com . Hanno un buon supporto per numerico, oltre a valuta, arrotondamenti, ecc.

Ho usato in un ambiente IE6, con poche modifiche ai CSS, ed è stato un successo ragionevole.

Ad esempio, è numericInputpossibile definire una classe CSS e può essere utilizzata per decorare i campi con le maschere di input numeriche.

adattato dal sito web autoNumeric:

$('input.numericInput').autoNumeric({aSep: '.', aDec: ','}); // very flexible!

autoNumeric è sicuramente la strada da percorrere
Prethen

3

Penso che questo sia un buon modo per risolvere questo problema ed è estremamente semplice:

$(function() {
    var pastValue, pastSelectionStart, pastSelectionEnd;

    $("input").on("keydown", function() {
        pastValue          = this.value;
        pastSelectionStart = this.selectionStart;
        pastSelectionEnd   = this.selectionEnd;
    }).on("input propertychange", function() {
        var regex = /^[0-9]+\.?[0-9]*$/;

        if (this.value.length > 0 && !regex.test(this.value)) {
            this.value          = pastValue;
            this.selectionStart = pastSelectionStart;
            this.selectionEnd   = pastSelectionEnd;
        }
    });
});

Esempio: JSFiddle

Scenari coperti

I consigli più simili qui falliscono almeno uno di questi o richiedono molto codice per coprire tutti questi scenari.

  1. Consente solo 1 punto decimale.
  2. Consente home, ende le arrowchiavi.
  3. Consente deletee backspaceda utilizzare in qualsiasi indice.
  4. Consente la modifica in qualsiasi indice (purché l'input corrisponda alla regex).
  5. Permette ctrl + v e shift + insert per input valido (lo stesso con il tasto destro + incolla).
  6. Non lampeggia il valore del testo perché l' keyupevento non viene utilizzato.
  7. Ripristina la selezione dopo un input non valido.

Scenari falliti

  • A partire da 0.5e cancellando solo lo zero non funzionerà. Questo può essere risolto modificando la regex in /^[0-9]*\.?[0-9]*$/e quindi aggiungendo un evento di sfocatura per anteporre a 0quando la casella di testo inizia con un punto decimale (se lo si desidera). Vedi questo scenario avanzato per una migliore idea di come risolvere questo problema.

Collegare

Ho creato questo semplice plugin jquery per renderlo più semplice:

$("input").limitRegex(/^[0-9]+\.?[0-9]*$/);

2

Il modo migliore è di controllare i contenuti della casella di testo ogni volta che perde la messa a fuoco.

Puoi verificare se il contenuto è un "numero" usando un'espressione regolare.

Oppure puoi utilizzare il plug-in di convalida, che sostanzialmente lo fa automaticamente.


L'espressione regolare sarebbe /^\d*\.{0,1}\d+$/
Chetan S

2

Controllare questo codice di ricerca per l'uso del database:

function numonly(root){
    >>var reet = root.value;
    var arr1 = reet.length;
    var ruut = reet.charAt(arr1-1);
    >>>if (reet.length > 0){
        var regex = /[0-9]|\./;
        if (!ruut.match(regex)){
            var reet = reet.slice(0, -1);
            $(root).val(reet);
        >>>>}
    }
}
//Then use the even handler onkeyup='numonly(this)'

2

Questo è uno snippet che ho appena fatto (usando una parte del codice di Peter Mortensen / Keith Bentrup) per una convalida percentuale intera su un campo di testo (è richiesto jQuery):

/* This validates that the value of the text box corresponds
 * to a percentage expressed as an integer between 1 and 100,
 * otherwise adjust the text box value for this condition is met. */
$("[id*='percent_textfield']").keyup(function(e){
    if (!isNaN(parseInt(this.value,10))) {
        this.value = parseInt(this.value);
    } else {
        this.value = 0;
    }
    this.value = this.value.replace(/[^0-9]/g, '');
    if (parseInt(this.value,10) > 100) {
        this.value = 100;
        return;
    }
});

Questo codice:

  • Consente di utilizzare i principali tasti numerici e il tastierino numerico.
  • Convalida per escludere i caratteri Maiusc-numerici (ad es. #, $,%, Ecc.)
  • Sostituisce i valori NaN con 0
  • Sostituisce con 100 valori superiori a 100

Spero che questo aiuti chi è nel bisogno.



2

Se stai utilizzando HTML5 non devi fare di tutto per eseguire la convalida. Usa solo -

<input type="number" step="any" />

L'attributo step consente al punto decimale di essere valido.


2
Non è così, Firefox e Opera consentono l'immissione di testo non numerico
Michael Fever

@MichaelDeMutis hai ragione, consente l'inserimento di testo non numerico ma non riesce la convalida in FF (non ho avuto l'opportunità di testare in Opera).
Jay Blanchard,

2

Altro modo per mantenere la posizione del cursore sull'ingresso:

$(document).ready(function() {
  $('.numbersOnly').on('input', function() {
    var position = this.selectionStart - 1;

    fixed = this.value.replace(/[^0-9\.]/g, '');  //remove all but number and .
    if(fixed.charAt(0) === '.')                  //can't start with .
      fixed = fixed.slice(1);

    var pos = fixed.indexOf(".") + 1;
    if(pos >= 0)
      fixed = fixed.substr(0,pos) + fixed.slice(pos).replace('.', '');  //avoid more than one .

    if (this.value !== fixed) {
      this.value = fixed;
      this.selectionStart = position;
      this.selectionEnd = position;
    }
  });
});

vantaggi:

  1. L'utente può utilizzare i tasti freccia, Backspace, Elimina, ...
  2. Funziona quando vuoi incollare i numeri

Plunker: Demo funzionante



1
    $(".numeric").keypress(function(event) {
  // Backspace, tab, enter, end, home, left, right
  // We don't support the del key in Opera because del == . == 46.
  var controlKeys = [8, 9, 13, 35, 36, 37, 39];
  // IE doesn't support indexOf
  var isControlKey = controlKeys.join(",").match(new RegExp(event.which));
  // Some browsers just don't raise events for control keys. Easy.
  // e.g. Safari backspace.
  if (!event.which || // Control keys in most browsers. e.g. Firefox tab is 0
      (49 <= event.which && event.which <= 57) || // Always 1 through 9
      (48 == event.which && $(this).attr("value")) || // No 0 first digit
      isControlKey) { // Opera assigns values for control keys.
    return;
  } else {
    event.preventDefault();
  }
});

Questo codice ha funzionato abbastanza bene con me, ho dovuto solo aggiungere il 46 nell'array controlKeys per usare il punto, anche se non credo sia il modo migliore per farlo;)


1

L'ho usato, con buoni risultati ..

ini=$("#id").val();
a=0;
$("#id").keyup(function(e){
    var charcode = (e.which) ? e.which : e.keyCode;
    // for decimal point
    if(!(charcode===190 || charcode===110))
    {           // for numeric keys andcontrol keys
        if (!((charcode>=33 && charcode<=57) || 
        // for numpad numeric keys
        (charcode>=96 && charcode<=105) 
        // for backspace
        || charcode==8)) 
        {
            alert("Sorry! Only numeric values allowed.");
            $("#id").val(ini);
        }
        // to include decimal point if first one has been deleted.
        if(charcode===8)
        {
            ini=ini.split("").reverse();
            if(ini[0]==".")
            a=0;                 
        }
    }
    else
    {
        if(a==1)
        {
            alert("Sorry! Second decimal point not allowed.");
            $("#id").val(ini);
        }
        a=1;
    }
    ini=$("#id").val();
});


find keycodes at http://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes

1

Questo è molto semplice che abbiamo già una funzione integrata javascript "isNaN" è lì.

$("#numeric").keydown(function(e){
  if (isNaN(String.fromCharCode(e.which))){ 
    return false; 
  }
});
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.