Come posso limitare possibili input in un elemento "numero" HTML5?


359

Per <input type="number">elemento, maxlengthnon funziona. Come posso limitare l' maxlengthelemento per quel numero?


5
Per le persone che cercano una soluzione migliore, questa è la migliore: stackoverflow.com/questions/9361193/…
Ünsal Korkmaz

4
L'attributo max non funziona nel browser Chrome nel tablet Android.
sempre il

4
@ ÜnsalKorkmaz: quella soluzione ha lo svantaggio di non far apparire la tastiera numerica sui dispositivi Android
Sarà

Risposte:


340

E puoi aggiungere un maxattributo che specificherà il numero più alto possibile che puoi inserire

<input type="number" max="999" />

se aggiungi sia un valore che maxun minvalore, puoi specificare l'intervallo di valori consentiti:

<input type="number" min="1" max="999" />

Quanto sopra non impedirà comunque all'utente di immettere manualmente un valore al di fuori dell'intervallo specificato. Invece verrà visualizzato un popup che gli dice di inserire un valore all'interno di questo intervallo dopo aver inviato il modulo come mostrato in questo screenshot:

inserisci qui la descrizione dell'immagine


4
Krister, ha funzionato. Inoltre, come ha detto @Andy, ho usato oninput per tagliare i numeri aggiuntivi. Riferimento mathiasbynens.be/notes/oninput
Prasad

7
@Prasad - Se la risposta di Andy è corretta, selezionala invece di quella più votata.
Moshe,

81
Questo è corretto, ma va notato come Andy afferma che ciò non impedisce a uno di digitare un numero più lungo. Quindi non è proprio l'equivalente di maxlength in un campo di testo.
DA.

9
Se hai semplicemente inserito un galleggiante di precisione superiore, questo si romperà. Ad esempio 3.1415926 aggira questo perché è inferiore a 999 e maggiore di 1.
0112

44
Non so perché sia ​​così votato e accettato quando semplicemente non funziona! Influisce solo sui controlli "spinner" e non fa nulla per impedire all'utente di digitare un numero lungo.
Codemonkey

115

È possibile specificare gli attributi mine max, che consentiranno l'input solo all'interno di un intervallo specifico.

<!-- equivalent to maxlength=4 -->
<input type="number" min="-9999" max="9999">

Questo funziona solo per i pulsanti di controllo della trottola, tuttavia. Sebbene l'utente possa essere in grado di digitare un numero maggiore di quello consentito max, il modulo non verrà inviato.

Messaggio di convalida di Chrome per numeri maggiori di max
Schermata tratta da Chrome 15

È possibile utilizzare l' oninputevento HTML5 in JavaScript per limitare il numero di caratteri:

myInput.oninput = function () {
    if (this.value.length > 4) {
        this.value = this.value.slice(0,4); 
    }
}

11
Un possibile problema con tale approccio JavaScript: potrebbe non funzionare come previsto se il punto di inserimento non si trova alla fine del valore. Ad esempio, se si immette il valore "1234" nel campo di immissione, quindi si sposta il punto di inserimento all'inizio del valore e si digita "5", si finisce con il valore "5123". Questo è diverso da un campo type = "text" di input con una lunghezza massima di 4, in cui il browser non consente di digitare un quinto carattere nel campo "full" e il valore rimarrà "1234".
Jon Schneider,

@Andy, ovviamente la domanda è alla ricerca di un modo non-JS di fare maxlength.............
Pacerier

4
@Pacerier: qualcosa nella mia risposta implicava che pensassi diversamente? Come puoi vedere, ho offerto la soluzione più vicina possibile che può essere ottenuta utilizzando solo HTML, insieme a un suggerimento aggiuntivo che utilizza JavaScript in cui l'OP potrebbe aver voluto impedire all'utente di digitare più caratteri di quanto consentito.
Andy E,

84

Se stai cercando una soluzione Web mobile in cui desideri che il tuo utente visualizzi un tastierino numerico anziché una tastiera full text. Usa type = "tel". Funzionerà con maxlength che ti evita di creare javascript extra.

Max e Min consentiranno comunque all'utente di digitare numeri in eccesso di max e min, il che non è ottimale.


3
Ottima scoperta, ha funzionato come un fascino, pollice in alto per non dover creare il javascript extra.
Diego,

9
Ho scoperto che questa non è la soluzione migliore per l'input numerico perché un input "tel" consente simboli aggiuntivi e visualizza lettere accanto a ciascun numero. La tastiera puramente numerica sembra molto più pulita.
Hawkharris,

@hawkharris Hai ragione, type = "number" è l'interfaccia utente più pulita. È più facile digitare accidentalmente un carattere errato. Pertanto è necessaria un'ulteriore convalida per garantire che l'utente non inserisca dati errati. Ma considera anche che l'utente può inserire altrettanto facilmente tutti i punti decimali anche con una tastiera numerica. Inoltre non risolve la domanda sopra senza JavaScript aggiuntivo.
Duane,

1
Grazie, sto lavorando su un'app mobile con framework ionico e questo ha risolto il mio problema
Ahmed,

1
se usato con pattern = "[0-9] *" i simboli extra saranno disabilitati
apereira,

71

Puoi combinare tutti questi in questo modo:

<input name="myinput_drs"
oninput="maxLengthCheck(this)"
type = "number"
maxlength = "3"
min = "1"
max = "999" />

<script>
  // This is an old version, for a more recent version look at
  // https://jsfiddle.net/DRSDavidSoft/zb4ft1qq/2/
  function maxLengthCheck(object)
  {
    if (object.value.length > object.maxLength)
      object.value = object.value.slice(0, object.maxLength)
  }
</script>


Aggiornamento:
potresti anche voler impedire l'inserimento di caratteri non numerici, perché object.lengthsarebbe una stringa vuota per gli input numerici e quindi la sua lunghezza sarebbe 0. Pertanto la maxLengthCheckfunzione non funzionerà.

Soluzione:
vedere questo o questo per esempi.

Demo - Guarda la versione completa del codice qui:
http://jsfiddle.net/DRSDavidSoft/zb4ft1qq/1/

Aggiornamento 2: ecco il codice di aggiornamento: https://jsfiddle.net/DRSDavidSoft/zb4ft1qq/2/

Aggiornamento 3: Si noti che consentire l'immissione di più di un punto decimale può incasinare il valore numerico.


Questa è una buona soluzione, ma trovo che object.value.length restituisca 0 se sono stati immessi valori non numerici.
Andrew,

1
@AndrewSpear Questo perché object.value sarebbe una stringa vuota se si immettono valori non numerici negli input con un tipo di 'numero' impostato. Vedi la documentazione Inoltre, leggi il mio aggiornamento per risolvere questo problema.
David Refoua,

Ciò si interrompe ancora se si immette più di un punto decimale, come 111..1111. Non utilizzare questo codice per motivi di sicurezza, poiché potrebbe ancora passare codice dannoso.
PieBie,

@PieBie Amico, questo codice è per 3+ anni fa. Utilizzare invece jQuery.
David Refoua,

1
sì, lo so, ma i principianti potrebbero ancora incollarlo e copiarlo.
PieBie il

26

è molto semplice, con alcuni javascript puoi simulare un maxlength, dai un'occhiata:

//maxlength="2"
<input type="number" onKeyDown="if(this.value.length==2) return false;" />

12
Con la tua soluzione non puoi usare backspace una volta raggiunti 2 caratteri. ma mi manca poco per una soluzione funzionale
Christophe Debove,

12
Invece di onKeyDown, dovresti usare onKeyPress.
Rupesh Arora,

1
non funzionerà se si evidenzia il testo e si preme un carattere (cioè per sostituire il contenuto dell'input)
Arijoon

convalidalo se non proviene dalle seguenti chiavi stackoverflow.com/a/2353562/1534925
Akshay

3
il problema keydownè che non puoi usare backspace con un numero massimo di caratteri. il problema keypressè che puoi copiare + incollare oltre il numero massimo di caratteri.
Stavm

23

Oppure se il tuo valore massimo è ad esempio 99 e minimo 0, puoi aggiungerlo all'elemento di input (il tuo valore verrà riscritto dal tuo valore massimo ecc.)

<input type="number" min="0" max="99" 
   onKeyUp="if(this.value>99){this.value='99';}else if(this.value<0){this.value='0';}"
id="yourid">

Quindi (se lo desideri), puoi verificare se è stato inserito il numero reale


... Fantastico, ma non hai più bisogno di min e max amico. (solo dicendo)
xoxel

2
@xoxel lo fai se vuoi che il messaggio di avviso sia ancora visualizzato
DNKROZ

Questo è davvero buono ... Grazie
Vincy Oommen il

per motivi di generalizzazione, fareionKeyUp="if(this.value>this.max)this.value=this.max;if(this.value<this.min)this.value=this.min;"
oriadam

18

Puoi specificarlo come testo, ma aggiungi pettern, che corrisponde solo ai numeri:

<input type="text" pattern="\d*" maxlength="2">

Funziona perfettamente e anche su dispositivi mobili (testato su iOS 8 e Android) fa apparire la tastiera numerica.


L'attributo pattern non è supportato in IE9 e nelle versioni precedenti e ha un supporto parziale in Safari: caniuse.com/#feat=input-pattern
diazdeteran

Sì, grazie per il puntamento, ma abbiamo eliminato il supporto IE9 (tagliandolo la senape) e lo preferisco ai metodi JS. Dipende dal progetto.
Chris Panayotoff,

2
A questo utente non viene impedito di inserire caratteri non numerici. Possono inserire 2 di qualsiasi carattere. L' patternunica causa è l'evidenziazione della convalida.
Brt

testato su Android 9 (Nokia 8) ma ho la tastiera normale :( qualche idea?
oriadam

14

//For Angular I have attached following snippet.
<div ng-app="">
  <form>
    Enter number: <input type="number" ng-model="number" onKeyPress="if(this.value.length==7) return false;" min="0">
  </form>
  <h1>You entered: {{number}}</h1>
</div>

Se si utilizza l'evento "onkeypress", non si otterrà alcuna limitazione dell'utente in quanto tale durante lo sviluppo (test unità). E se hai dei requisiti che non consentono all'utente di entrare dopo un limite particolare, dai un'occhiata a questo codice e prova una volta.


1
I problemi che vedo qui sono: 1. sostituisci con seleziona il testo e digita non funziona se l'input ha raggiunto 7 numeri 2. aumentando l'input di 1 quando gli hit "boarder" di overflow funzionano -> 9999999 e fai clic pulsante. Rompe la limitazione
Edub

Ho provato con la versione semplice javascript. Se vuoi puoi vedere usando lo snippet di codice Run. Come tale non ho trovato alcuna limitazione.
Prasad Shinde,

1
Non ho trovato alcun limite. Si ferma a 7 cifre. Sto usando questa soluzione per il mio codice.
Claudio

C'è una limitazione. Quando si raggiunge il limite, selezionare tutto e si desidera sostituirli, non funziona. La sostituzione funziona per me solo quando sovrascrivo il valore con quello cur prima di restituire false.
Insomnia88

@ Insomnia88, @ edub che cosa succede se scriviamo la funzione e controlliamo le condizioni necessarie ...
Prasad Shinde

12

Un'altra opzione è semplicemente aggiungere un listener per qualsiasi cosa con l'attributo maxlength e aggiungere il valore slice a quello. Supponendo che l'utente non desideri utilizzare una funzione all'interno di ogni evento correlato all'input. Ecco uno snippet di codice. Ignora il codice CSS e HTML, JavaScript è ciò che conta.

// Reusable Function to Enforce MaxLength
function enforce_maxlength(event) {
  var t = event.target;
  if (t.hasAttribute('maxlength')) {
    t.value = t.value.slice(0, t.getAttribute('maxlength'));
  }
}

// Global Listener for anything with an maxlength attribute.
// I put the listener on the body, put it on whatever.
document.body.addEventListener('input', enforce_maxlength);
label { margin: 10px; font-size: 16px; display: block }
input { margin: 0 10px 10px; padding: 5px; font-size: 24px; width: 100px }
span { margin: 0 10px 10px; display: block; font-size: 12px; color: #666 }
<label for="test_input">Text Input</label>
<input id="test_input" type="text" maxlength="5"/>
<span>set to 5 maxlength</span>

<br>

<label for="test_input">Number Input</label>
<input id="test_input" type="number" min="0" max="99" maxlength="2"/>
<span>set to 2 maxlength, min 0 and max 99</span>


10

La lunghezza massima non funzionerà <input type="number"nel modo migliore che conosco sia utilizzare l' oninputevento per limitare la lunghezza massima. Si prega di consultare il codice seguente per una semplice implementazione.

<input name="somename"
    oninput="javascript: if (this.value.length > this.maxLength) this.value = this.value.slice(0, this.maxLength);"
    type = "number"
    maxlength = "6"
 />

Ha funzionato come un fascino!
SiboVG

9

Supponiamo che tu abbia voluto che il valore massimo consentito fosse 1000 - digitato o con lo spinner.

È possibile limitare i valori del filatore utilizzando: type="number" min="0" max="1000"

e limitare ciò che viene digitato dalla tastiera con javascript: onkeyup="if(parseInt(this.value)>1000){ this.value =1000; return false; }"

<input type="number" min="0" max="1000" onkeyup="if(parseInt(this.value)>1000){ this.value =1000; return false; }">

8

Come affermato da altri, min / max non è uguale a maxlength perché le persone potrebbero comunque entrare in un float che sarebbe più grande della lunghezza massima della stringa desiderata. Per emulare veramente l'attributo maxlength, puoi fare qualcosa del genere in un pizzico (questo equivale a maxlength = "16"):

<input type="number" oninput="if(value.length>16)value=value.slice(0,16)">

slice eliminerà i caratteri all'insaputa dell'utente finale quando inseriti tra. mentre la lunghezza massima si bloccherà.
Pradeep Kumar Prabaharan,

@PradeepKumarPrabaharan maxlengthnon è supportato dagli input numerici. Nel mio esempio, value.slice(0,16)non verrà avviato a meno che il valore di input non sia più lungo di 16 caratteri.
entro il

sì, maxlength non è supportato per gli input numerici .. questo codice è gud ma questo codice non corrisponde esattamente alla proprietà di maxlength ..
Pradeep Kumar Prabaharan,

@TobiasGaertner se type="number"ne occupa :).
thdoan

@ 10basetom ... a seconda del browser ... ad es. In FF puoi comunque inserire i caratteri e questi non si fermeranno dopo il limite - ma in relazione all'idea del numero del tipo questa è una soluzione accettabile.
Tobias Gaertner,

6

La risposta di Maycow Moura è stata un buon inizio. Tuttavia, la sua soluzione significa che quando si inserisce la seconda cifra, tutte le modifiche al campo si interrompono. Quindi non è possibile modificare i valori o eliminare alcun carattere.

Il codice seguente si ferma su 2, ma consente di continuare la modifica;

//MaxLength 2
onKeyDown="if(this.value.length==2) this.value = this.value.slice(0, - 1);"

2
No. Prova a incollare un valore.
Qwertiy,

6

Ho avuto questo problema prima e l'ho risolto usando una combinazione di tipo di numero html5 e jQuery.

<input maxlength="2" min="0" max="59" name="minutes" value="0" type="number"/>

script:

$("input[name='minutes']").on('keyup keypress blur change', function(e) {
    //return false if not 0-9
    if (e.which != 8 && e.which != 0 && (e.which < 48 || e.which > 57)) {
       return false;
    }else{
        //limit length but allow backspace so that you can still delete the numbers.
        if( $(this).val().length >= parseInt($(this).attr('maxlength')) && (e.which != 8 && e.which != 0)){
            return false;
        }
    }
});

Non so se gli eventi siano un po 'eccessivi, ma ha risolto il mio problema. JSfiddle


Puoi facilmente incollare i personaggi.
Jessica,

4

Input HTML

 <input class="minutesInput" type="number" min="10" max="120" value="" />

jQuery

 $(".minutesInput").on('keyup keypress blur change', function(e) {

    if($(this).val() > 120){
      $(this).val('120');
      return false;
    }

  });

4

un modo semplice per impostare la massima lunghezza per gli input numerici è:

<input type="number" onkeypress="return this.value.length < 4;" oninput="if(this.value.length>=4) { this.value = this.value.slice(0,4); }" />

non funziona su Android Chrome. onkeypress ha alcuni problemi con questo.
Aakash Thakur,

3

Come per type="number", si specifica un maxinvece di maxlengthproprietà, che è il numero massimo possibile. Quindi, con 4 cifre, maxdovrebbe essere 9999, 5 cifre 99999e così via.

Inoltre, se si desidera assicurarsi che sia un numero positivo, è possibile impostare min="0", garantendo numeri positivi.


3

Ugh. È come se qualcuno avesse rinunciato a metà dell'implementazione e pensasse che nessuno se ne sarebbe accorto.

Per qualsiasi motivo, le risposte sopra non usano gli attributi mine max. Questo jQuery lo completa:

    $('input[type="number"]').on('input change keyup paste', function () {
      if (this.min) this.value = Math.max(parseInt(this.min), parseInt(this.value) || 0);
      if (this.max) this.value = Math.min(parseInt(this.max), parseInt(this.value) || 0);
    });

Probabilmente funzionerebbe anche come una funzione denominata "oninput" senza jQuery se il tuo uno di quei tipi "jQuery-is-the-diavolo".


non risponde correttamente alla domanda, ma ha votato perché ha risolto il mio problema :)
TrOnNe

2

Come ho scoperto non è possibile utilizzare qualsiasi onkeydown, onkeypresso di onkeyupeventi per una soluzione completa che include browser mobili. A proposito onkeypressè deprecato e non è più presente in Chrome / Opera per Android (vedi: UI Events W3C Working Draft, 04 agosto 2016 ).

Ho trovato una soluzione usando oninputsolo l' evento. Potrebbe essere necessario eseguire un ulteriore controllo numerico come richiesto come segno negativo / positivo o decimale e migliaia di separatori e simili, ma come inizio dovrebbe essere sufficiente quanto segue:

function checkMaxLength(event) {
	// Prepare to restore the previous value.
	if (this.oldValue === undefined) {
		this.oldValue = this.defaultValue;
	}

	if (this.value.length > this.maxLength) {
		// Set back to the previous value.
		this.value = oldVal;
	}
	else {
		// Store the previous value.
		this.oldValue = this.value;
		
		// Make additional checks for +/- or ./, etc.
		// Also consider to combine 'maxlength'
		// with 'min' and 'max' to prevent wrong submits.
	}
}

Io consiglio anche di combinare maxlengthcon mine maxper evitare che sottomette sbagliate come si è detto più volte.


2
<input type="number" onchange="this.value=Math.max(Math.min(this.value, 100), -100);" />

o se vuoi essere in grado di inserire nulla

<input type="number" onchange="this.value=this.value ? Math.max(Math.min(this.value,100),-100) : null" />

1

Puoi provare anche questo per input numerici con limitazione di lunghezza

<input type="tel" maxlength="3" />

@tiltdown Sry per mistype. Corretta la risposta
shinobi,

1

So che c'è già una risposta, ma se vuoi che il tuo input si comporti esattamente come l' maxlengthattributo o il più vicino possibile, usa il seguente codice:

(function($) {
 methods = {
    /*
     * addMax will take the applied element and add a javascript behavior
     * that will set the max length
     */
    addMax: function() {
        // set variables
        var
            maxlAttr = $(this).attr("maxlength"),
            maxAttR = $(this).attr("max"),
            x = 0,
            max = "";

        // If the element has maxlength apply the code.
        if (typeof maxlAttr !== typeof undefined && maxlAttr !== false) {

            // create a max equivelant
            if (typeof maxlAttr !== typeof undefined && maxlAttr !== false){
                while (x < maxlAttr) {
                    max += "9";
                    x++;
                }
              maxAttR = max;
            }

            // Permissible Keys that can be used while the input has reached maxlength
            var keys = [
                8, // backspace
                9, // tab
                13, // enter
                46, // delete
                37, 39, 38, 40 // arrow keys<^>v
            ]

            // Apply changes to element
            $(this)
                .attr("max", maxAttR) //add existing max or new max
                .keydown(function(event) {
                    // restrict key press on length reached unless key being used is in keys array or there is highlighted text
                    if ($(this).val().length == maxlAttr && $.inArray(event.which, keys) == -1 && methods.isTextSelected() == false) return false;
                });;
        }
    },
    /*
     * isTextSelected returns true if there is a selection on the page. 
     * This is so that if the user selects text and then presses a number
     * it will behave as normal by replacing the selection with the value
     * of the key pressed.
     */
    isTextSelected: function() {
       // set text variable
        text = "";
        if (window.getSelection) {
            text = window.getSelection().toString();
        } else if (document.selection && document.selection.type != "Control") {
            text = document.selection.createRange().text;
        }
        return (text.length > 0);
    }
};

$.maxlengthNumber = function(){
     // Get all number inputs that have maxlength
     methods.addMax.call($("input[type=number]"));
 }

})($)

// Apply it:
$.maxlengthNumber();

@Phill_t forse puoi illuminarmi? Ho usato il tuo codice e funziona bene nel principio MA "$ (this) .attr (" maxlength ")" recapita sempre 2. E perché sarebbe meglio usare "$ (this) .attr (" maxlength ")" se funzionasse anziché semplicemente "this.maxlength" che ho testato e funzionasse come previsto ed è più breve e forse anche più chiaro da leggere? Mi sono perso qualcosa?
markus s

Cosa intendi con "consegna 2"?
Philll_t,

Phill_t mi scuso. "this.maxLength" funziona solo nell'ambito della funzione keydown. Nella funzione "addMax" "questo" è il documento anziché l'elemento previsto e pertanto ha valori di attributo diversi. Come ottenere invece l'accesso all'immissione del numero? Il codice sopra funziona davvero dalla tua parte? Ho provato con Chrome / Opera / Vivaldi, Firefox, Edge, IE e Safari e ho avuto gli stessi risultati per ogni browser. Ok, in Edge maxlegth = "1" e maxlength = "2" dove effettivamente funziona ma "$ (this) .attr (" maxlength ")" non aumenta ulteriormente per nessun numero più alto !!? @anybody: qualche suggerimento?
markus s

Come ho già detto, è sempre due perché viene richiamato sul documento anziché sull'elemento in questione, come ho scoperto durante il debug. A proposito, potresti anche voler esaminare la mia soluzione che ho capito dopo aver studiato la tua: stackoverflow.com/a/41871960/1312012
markus s

0

Attributi più pertinenti da utilizzare sarebbero mine max.


0

Questo potrebbe aiutare qualcuno.

Con un po 'di javascript puoi cercare tutti gli input datetime-local, cercare se l'anno che l'utente sta cercando di inserire, più di 100 anni in futuro:

$('input[type=datetime-local]').each(function( index ) {

    $(this).change(function() {
      var today = new Date();
      var date = new Date(this.value);
      var yearFuture = new Date();
      yearFuture.setFullYear(yearFuture.getFullYear()+100);

      if(date.getFullYear() > yearFuture.getFullYear()) {

        this.value = today.getFullYear() + this.value.slice(4);
      }
    })
  });
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.