lunghezza massima ignorata per tipo di input = "numero" in Chrome


231

L' maxlengthattributo non funziona con <input type="number">. Questo succede solo in Chrome.

<input type="number" class="test_css"  maxlength="4"  id="flight_number" name="number"/>

Risposte:


277

Dalla documentazione di MDN per<input>

Se il valore del tipo di attributo è text, email, search, password, tel, o url, questo attributo specifica il numero massimo di caratteri (in punti di codice Unicode) che l'utente può inserire; per altri tipi di controllo, viene ignorato.

Quindi maxlengthviene ignorato <input type="number">dal design.

A seconda delle tue esigenze, puoi utilizzare gli attributi mine maxcome inon suggerito nella sua risposta (NB: questo definirà solo un intervallo limitato, non la lunghezza effettiva del valore del valore, sebbene da -9999 a 9999 coprirà tutti 0-4 numeri numerici) oppure puoi utilizzare un normale input di testo e applicare la convalida sul campo con il nuovo patternattributo:

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

13
Si noti inoltre che type="number"è un nuovo tipo dalla specifica HTML 5. Se il browser che si sta testando in non riconosce type="number"lo tratterà come type="text", che fa rispettare l' maxlengthattributo. Questo potrebbe spiegare il comportamento che stai vedendo.
André Dion,

8
@fooquency, non sei proprio qui, poiché in realtà non puoi limitare la lunghezza fisica di "input da tastiera" type=numberall'input impostando l' maxattributo. Questo attributo limita solo il numero scelto dallo spinner dell'input.
Kamilius,

5
cosa c'è \d*qui?
Pardeep Jain,

4
pattern = "\ d *" non funziona in IE11 o Firefox 56. jsfiddle.net/yyvrz84v
Reado

4
L'uso regexe il pattern sono incredibilmente creativi. Ma nei dispositivi mobili, non è diverso Androido iOSè un textinput, quindi causa un cattivo UX.
Amerllic,

215

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 qui sotto.

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

Brillante. GRAZIE!
Taketheleap,

La versione di @Guedes funziona per me in tutti i dispositivi testati impostando il tipo su "numero". Tuttavia non capisco fino in fondo la seconda parte dell'espressione||0/1
Barleby,

34
@Barleby. oninput="this.value=this.value.slice(0,this.maxLength)"Dovrei solo funzionare
Washington Guedes il

1
@ Codice di WashingtonGuedes sopra ha lavorato per me su <input type="number"> stackoverflow.com/questions/18510845/...
David Yeiser

1
Attenzione che gli zeri iniziali non vengono visualizzati con questo approccio!
Hadid Ali

53

Molti ragazzi hanno pubblicato un onKeyDown()evento che non funziona affatto, cioè non è possibile eliminare una volta raggiunto il limite. Quindi, invece di onKeyDown()utilizzare onKeyPress()e funziona perfettamente.

Di seguito è riportato il codice di lavoro:

User will not be allowed to enter more than 4 digits
<br>
<input type="number" pattern="/^-?\d+\.?\d*$/" onKeyPress="if(this.value.length==4) return false;" />


3
questo è molto utile, più breve e molto meglio di qualsiasi altra risposta qui mantenendo il numbertipo di input html5
Dexter Bengil

4
Ho provato, dopo aver inserito 4 cifre, la casella di testo, si blocca semplicemente senza spazio per alcun aggiornamento, né i tasti di cancellazione né backspace funzionano, nulla funziona, come modificare le cifre, per favore, menziona.
Abbas,

1
Sono stato in grado di entrare nel tuo frammento (1.2.3.4.5.5.6.76.7)
Alaa "

1
Questa dovrebbe essere la risposta accettata. Modo molto intelligente per mantenere il campo numerico. Assicurati solo di aggiungere un attributo min / max poiché i pulsanti di selezione possono comunque andare oltre le 4 cifre se vengono utilizzati
NiallMitch14

3
Non funziona quando si digita 9999 e si preme il pulsante su in input.
Csaba Gergely,

37

Ho due modi per farlo

Primo: usa type="tel", funzionerà come type="number"su cellulare e accetta maxlength:

<input type="tel" />

Secondo: usa un po 'di JavaScript:

<!-- maxlength="2" -->
<input type="tel" onKeyDown="if(this.value.length==2 && event.keyCode!=8) return false;" />

2
la tua seconda risposta non è molto buona: se hai raggiunto 2 caratteri, non puoi cancellare nessun numero.
vtni

Sì, ho anche notato che un input numerico non restituisce value.length, comunque, l'ho modificato incluso Backspace
keycode

2
dovrebbero essere inclusi anche i tasti dell'array e il pulsante Elimina (avanti).
vtni

Questo è carino. e questo funziona solo per me
votato

1
Ottima risposta, grazie. Tuttavia, in questo caso non ho la ragione per usare 'tel' invece di 'numero'. Inoltre puoi sostituire la tua condizione di "event.keyCode! = 8" con "event.keyCode> 47 && event.keyCode <58" in caso di numeri naturali per disabilitare l'utente solo dall'immissione di cifre.
Dudi,

28

È possibile utilizzare gli attributi min e max .

Il seguente codice fa lo stesso:

<input type="number" min="-999" max="9999"/>

2
Direi che questa dovrebbe essere la risposta corretta qui. Chrome almeno ridimensiona la scatola in modo ragionevole in base ai parametri min / max.
Fooquency,

71
Questo non funziona se si desidera aggiungere una limitazione di lunghezza, sebbene non sia possibile superare il numero che 9999l'utente può digitare manualmente un numero che supera tale lunghezza.
Philll_t

10

Cambia il tipo di input in testo e usa l'evento "oninput" per chiamare la funzione:

<input type="text" oninput="numberOnly(this.id);" class="test_css" maxlength="4" id="flight_number" name="number"/>

Ora usa Javascript Regex per filtrare l'input dell'utente e limitarlo solo ai numeri:

function numberOnly(id) {
    // Get element by id which passed as parameter within HTML element event
    var element = document.getElementById(id);
    // Use numbers only pattern, from 0 to 9
    var regex = /[^0-9]/gi;
    // This removes any other character but numbers as entered by user
    element.value = element.value.replace(regex, "");
}

Demo: https://codepen.io/aslami/pen/GdPvRY


1
migliore risposta "solo numeri" che ho trovato. Altri che usano evt.keycode sembrano fallire sul mio androide
deebs

1
Una mod molto piccola, cambia "this.id" in "this", numberOnly (id) in numberOnly (element), quindi non hai bisogno della prima riga del numeroSolo e funziona senza un id
tony

8

Una volta ho avuto lo stesso problema e ho trovato questa soluzione rispetto alle mie esigenze. Potrebbe aiutare qualcuno.

<input type="number" placeholder="Enter 4 Digits" max="9999" min="0" 
onKeyDown="if(this.value.length==4 && event.keyCode>47 && event.keyCode < 58)return false;"
/>

Happy Coding :)


3

Puoi provare anche questo per input numerici con limitazione di lunghezza

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

8
in alcuni browser (in particolare per dispositivi mobili), l' telinput verrà automaticamente convalidato come tale e in alcuni casi strani i principali 0s verranno cambiati in 1s.
Philll_t

3
<input type="number" oninput="this.value = this.value.replace(/[^0-9.]/g, ''); this.value = this.value.replace(/(\..*)\./g, '$1');" onKeyDown="if(this.value.length==10 && event.keyCode!=8) return false;">

DEMO - JSFIDDLE


3

Ecco la mia soluzione con jQuery ... Devi aggiungere la massima lunghezza al tuo tipo di input = numero

$('body').on('keypress', 'input[type=number][maxlength]', function(event){
    var key = event.keyCode || event.charCode;
    var charcodestring = String.fromCharCode(event.which);
    var txtVal = $(this).val();
    var maxlength = $(this).attr('maxlength');
    var regex = new RegExp('^[0-9]+$');
    // 8 = backspace 46 = Del 13 = Enter 39 = Left 37 = right Tab = 9
    if( key == 8 || key == 46 || key == 13 || key == 37 || key == 39 || key == 9 ){
        return true;
    }
    // maxlength allready reached
    if(txtVal.length==maxlength){
        event.preventDefault();
        return false;
    }
    // pressed key have to be a number
    if( !regex.test(charcodestring) ){
        event.preventDefault();
        return false;
    }
    return true;
});

E gestisci copia e incolla:

$('body').on('paste', 'input[type=number][maxlength]', function(event) {
    //catch copy and paste
    var ref = $(this);
    var regex = new RegExp('^[0-9]+$');
    var maxlength = ref.attr('maxlength');
    var clipboardData = event.originalEvent.clipboardData.getData('text');
    var txtVal = ref.val();//current value
    var filteredString = '';
    var combined_input = txtVal + clipboardData;//dont forget old data

    for (var i = 0; i < combined_input.length; i++) {
        if( filteredString.length < maxlength ){
            if( regex.test(combined_input[i]) ){
                filteredString += combined_input[i];
            }
        }
    }
    setTimeout(function(){
        ref.val('').val(filteredString)
    },100);
});

Spero che aiuti qualcuno.


Ho avuto la stessa idea (anche se ho usato l'evento "input"), ma penso che la soluzione che @WashingtonGuedes ha scritto in un commento a un'altra risposta sia molto più semplice: this.value = this.value.slice(0, this.maxLength);pensi che questo abbia qualche problema? Non ne ho trovato finora. Copre anche il testo incollato.
nonzaprej,

Mi piace la strada lunga. L'utilizzo di RegExp è molto flessibile.
Harley81,

2

Nella mia esperienza, la maggior parte dei problemi in cui le persone chiedono perché maxlengthviene ignorato è perché l'utente è autorizzato a inserire più del numero "consentito" di caratteri.

Come altri commenti hanno affermato, gli type="number"input non hanno un maxlengthattributo e, invece, hanno un attributo mine max.

Affinché il campo limiti il ​​numero di caratteri che possono essere inseriti consentendo all'utente di essere a conoscenza di questo prima che il modulo sia inviato (il browser dovrebbe identificare il valore> max altrimenti), dovrai (almeno per ora) aggiungere un ascoltatore del campo.

Ecco una soluzione che ho usato in passato: http://codepen.io/wuori/pen/LNyYBM


min e max sono inutili qui, non impediscono all'utente di digitare una quantità infinita di numeri nel campo di input.
andreszs,

Vero. L'unica volta che li vedi in azione è quando stai usando i tasti freccia o i controller su / giù (in Chrome, ecc.). Puoi ancora usare questi attributi per legare alla tua successiva convalida, che ha funzionato per me. Ciò consente di controllare i limiti solo tramite markup (i18n, ecc.) Rispetto a JS.
M Wuori,

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();

Mi piace questo, modificato leggermente per uso personale (non volevo che le persone digitassero una "e" in chrome, che è permesso);
Mathijs Segers,


1

La soluzione assoluta che ho appena provato è:

<input class="class-name" placeholder="1234567" name="elementname"  type="text" maxlength="4" onkeypress="return (event.charCode == 8 || event.charCode == 0 || event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <= 57" />

Poiché si tratta di un JS generico, funzionerà ovunque. Sto lavorando a un progetto usando Angular 5 e funziona come un incantesimo. Probabilmente puoi dedicare 10 minuti alla creazione di un servizio nel tuo codice angolare in modo da poterlo riutilizzare in tutto il progetto.
Mr. Benedict

0

Lo renderò veloce e facile da capire!

Invece di maxlength per type='number'(maxlength ha lo scopo di definire la quantità massima di lettere per una stringa in un texttipo), usare min=''e max=''.

Saluti


0

<input type="number"> è solo questo ... un input numerico (anche se non convertito da una stringa a float tramite Javascript).

Immagino che non limiti i caratteri sull'inserimento dei tasti da maxLengthparte del tuo utente, altrimenti il ​​tuo utente potrebbe rimanere bloccato in una "trappola chiave" se all'inizio avesse dimenticato un decimale (prova a inserire un .indice 1quando <input type"text">è già stato raggiunto un attr "maxLength" ). Verrà comunque convalidato all'invio del modulo se si imposta un maxattributo.

Se stai cercando di limitare / convalidare un numero di telefono, usa type="tel"attr / value. Obbedisce maxLengthall'attrazione e fa apparire solo la tastiera numerica mobile (nei browser moderni) e puoi limitare l'input a un modello (cioè pattern="[0-9]{10}").


0

Per gli utenti di React,

Basta sostituire 10 con il requisito di lunghezza massima

 <input type="number" onInput={(e) => e.target.value = e.target.value.slice(0, 10)}/>

-1

maxlenght - tipo di testo di input

<input type="email" name="email" maxlength="50">

usando jQuery:

$("input").attr("maxlength", 50)

maxlenght - numero del tipo di input

JS

function limit(element, max) {    
    var max_chars = max;
    if(element.value.length > max_chars) {
        element.value = element.value.substr(0, max_chars);
    } 
}

HTML

<input type="number" name="telefono" onkeydown="limit(this, 20);" onkeyup="limit(this, 20);">
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.