Maximale Länge für Eingabetyp = "Nummer" in Chrome ignoriert

231

Das maxlengthAttribut funktioniert nicht mit <input type="number">. Dies geschieht nur in Chrome.

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

Antworten:

277

Aus der MDN-Dokumentation für<input>

Wenn der Wert des Typ - Attribut ist text, email, search, password, tel, oder url, gibt dieses Attribut die maximale Anzahl von Zeichen (in Unicode - Codepunkte), die der Benutzer eingeben kann; Bei anderen Steuerelementtypen wird dies ignoriert.

Wird maxlengthalso <input type="number">vom Design ignoriert .

Abhängig von Ihren Anforderungen können Sie die Attribute minund maxwie in der Antwort vorgeschlagen verwenden ( Hinweis : Dies definiert nur einen eingeschränkten Bereich, nicht die tatsächliche Zeichenlänge des Werts, obwohl -9999 bis 9999 alle 0-4 abdecken Ziffern) oder Sie können eine reguläre Texteingabe verwenden und die Validierung des Feldes mit dem neuen patternAttribut erzwingen :

<input type="text" pattern="\d*" maxlength="4">
André Dion
quelle
13
Beachten Sie auch, dass dies type="number"ein neuer Typ aus der HTML 5-Spezifikation ist. Wenn der Browser in Ihnen zu testen sind nicht erkennt type="number"es als behandeln type="text"denen sich das respektieren maxlengthAttribut. Dies kann das Verhalten erklären, das Sie sehen.
André Dion
8
@fooquency, Sie sind hier nicht richtig, da Sie die physische Länge der "Tastatureingabe" nicht type=numberdurch Einstellen des maxAttributs auf die Eingabe beschränken können . Dieses Attribut beschränkt nur die vom Drehfeld der Eingabe ausgewählte Anzahl.
Kamilius
5
was ist \d*hier
Pardeep Jain
4
pattern = "\ d *" funktioniert nicht in IE11 oder Firefox 56. jsfiddle.net/yyvrz84v
Reado
4
Verwenden regexund Muster ist unglaublich kreativ. Aber in mobilen, nicht anders Androidoder iOS, es ist eine textEingabe, so dass es eine schlechte verursacht UX.
AmerllicA
214

Die maximale Länge funktioniert nicht mit <input type="number"der besten Art und Weise, wie ich weiß, das oninputEreignis zu verwenden, um die maximale Länge zu begrenzen. Bitte beachten Sie den folgenden Code.

<input name="somename"
    oninput="javascript: if (this.value.length > this.maxLength) this.value = this.value.slice(0, this.maxLength);"
    type = "number"
    maxlength = "6"
 />
Neha Jain
quelle
Brillant. VIELEN DANK!
Nehmen Sie den Sprung
Die @ Guedes-Version funktioniert bei allen getesteten Geräten und setzt den Typ auf "Nummer". Allerdings verstehe ich den zweiten Teil des Ausdrucks nicht vollständig||0/1
Barleby
34
@ Barleby. Sollte einfach oninput="this.value=this.value.slice(0,this.maxLength)"funktionieren
Washington Guedes
1
@ WashingtonGuedes Code oben funktionierte für mich auf <input type="number"> stackoverflow.com/questions/18510845/…
David Yeiser
1
Beachten Sie, dass bei diesem Ansatz keine führenden Nullen angezeigt werden!
HadidAli
52

Viele Leute haben ein onKeyDown()Ereignis gepostet , das überhaupt nicht funktioniert, dh Sie können es nicht löschen, sobald Sie das Limit erreicht haben. Also statt zu onKeyDown()benutzen onKeyPress()und es funktioniert einwandfrei.

Unten ist Arbeitscode:

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;" />

Vikasdeep Singh
quelle
3
Dies ist sehr hilfreich, kürzer und viel besser als alle anderen Antworten hier, während der HTML5- numberEingabetyp beibehalten wird
Dexter Bengil
4
Ich habe versucht, nach Eingabe von 4 Ziffern, das Textfeld wird einfach eingefroren, ohne Platz für Aktualisierungen, weder Löschen noch Rücktaste funktionieren, nichts funktioniert, wie man Ziffern bearbeitet, bitte erwähnen.
Abbas
1
Ich konnte in ur snippet (1.2.3.4.5.5.6.76.7)
Alaa
1
Dies sollte die akzeptierte Antwort sein. Sehr clevere Art, das Zahlenfeld zu halten. Stellen Sie nur sicher, dass Sie ein Min / Max-Attribut hinzufügen, da die
Drehknöpfe
3
Funktioniert nicht, wenn Sie 9999 eingeben und bei der Eingabe die Aufwärts-Taste drücken.
Csaba Gergely
37

Ich habe zwei Möglichkeiten, wie Sie das tun können

Erstens: Verwenden Sie es type="tel", es funktioniert wie type="number"auf Mobilgeräten und akzeptiert die maximale Länge:

<input type="tel" />

Zweitens: Verwenden Sie ein wenig JavaScript:

<!-- maxlength="2" -->
<input type="tel" onKeyDown="if(this.value.length==2 && event.keyCode!=8) return false;" />
Maycow Moura
quelle
2
Ihre zweite Antwort ist nicht sehr gut: Wenn Sie 2 Zeichen erreicht haben, können Sie keine Nummer löschen.
17.
Ja, ich habe auch festgestellt, dass eine Zahleneingabe keinen Wert zurückgibt. Länge, trotzdem habe ich sie bearbeitet, einschließlich des Backspace-
Schlüsselcodes
2
Die Array-Schlüssel und die Schaltfläche zum Löschen (Weiterleiten) sollten ebenfalls enthalten sein.
20.
Das ist schön. und das funktioniert nur für mich
..
1
Tolle Antwort, tnx. In diesem Fall habe ich jedoch nicht den Grund, "tel" anstelle von "number" zu verwenden. Darüber hinaus können Sie Ihre Bedingung "event.keyCode! = 8" durch "event.keyCode> 47 && event.keyCode <58" bei natürlichen Zahlen ersetzen, um den Benutzer nur daran zu hindern, Ziffern einzugeben.
Dudi
28

Sie können die Attribute min und max verwenden .

Der folgende Code macht dasselbe:

<input type="number" min="-999" max="9999"/>
inon
quelle
2
Ich würde sagen, das sollte hier die richtige Antwort sein. Chrome ändert die Größe der Box zumindest dann sinnvoll basierend auf den Min / Max-Parametern.
Frequenz
70
Dies funktioniert jedoch nicht, wenn Sie eine Längenbeschränkung hinzufügen möchten, während Sie die Zahl nicht überschreiten können, die 9999der Benutzer manuell in eine Zahl eingeben kann, die diese Länge überschreitet.
Philll_t
10

Ändern Sie Ihren Eingabetyp in Text und rufen Sie mit dem Ereignis "oninput" die Funktion auf:

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

Verwenden Sie jetzt Javascript Regex, um Benutzereingaben zu filtern und nur auf Zahlen zu beschränken:

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

Masood
quelle
1
beste "nur Zahlen" Antwort, die ich gefunden habe. Andere, die evt.keycode verwenden, scheinen auf meinem Android
deebs
1
Eine sehr geringe mod, change „this.id“ auf „this“, numberOnly (id) zu numberOnly (Element), dann müssen Sie nicht die erste Zeile von numberOnly und es funktioniert ohne id
tony
8

Ich bin einmal auf dasselbe Problem gestoßen und habe diese Lösung in Bezug auf meine Bedürfnisse gefunden. Es kann jemandem helfen.

<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;"
/>

Viel Spaß beim Codieren :)

Mohammad Mahroz
quelle
3

Sie können dies auch für numerische Eingaben mit Längenbeschränkung versuchen

<input type="tel" maxlength="4" />
Shinobi
quelle
8
In einigen Browsern (insbesondere auf Mobilgeräten) wird die telEingabe automatisch als solche validiert, und in einigen seltsamen Fällen werden führende 0s in 1s geändert .
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

Surya R Praveen
quelle
3

Hier ist meine Lösung mit jQuery ... Sie müssen Ihrem Eingabetyp = Nummer die maximale Länge hinzufügen

$('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;
});

Und behandeln Kopieren und Einfügen:

$('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);
});

Ich hoffe es hilft jemandem.

harley81
quelle
Ich hatte die gleiche Idee (obwohl ich das "Eingabe" -Ereignis verwendet habe), aber ich denke, die Lösung, die @WashingtonGuedes in einem Kommentar zu einer anderen Antwort geschrieben hat, ist viel einfacher: this.value = this.value.slice(0, this.maxLength);Glauben Sie, dass dies ein Problem hat? Ich habe noch keine gefunden. Es behandelt auch eingefügten Text.
Nonzaprej
Ich mag den langen Weg. Die Verwendung von RegExp ist sehr flexibel.
Harley81
2

Nach meiner Erfahrung sind die meisten Probleme, bei denen gefragt wird, warum maxlengthignoriert wird, darauf zurückzuführen, dass der Benutzer mehr als die "zulässige" Anzahl von Zeichen eingeben darf.

Wie andere Kommentare erwähnten, type="number"Eingänge haben kein maxlengthAttribut und stattdessen eine hat minund maxAttribut.

Damit das Feld die Anzahl der Zeichen begrenzt, die eingefügt werden können, während der Benutzer sich dessen bewusst ist, bevor das Formular gesendet wird (der Browser sollte ansonsten den Wert> max identifizieren), müssen Sie (zumindest vorerst) a hinzufügen Zuhörer auf dem Feld.

Hier ist eine Lösung, die ich in der Vergangenheit verwendet habe: http://codepen.io/wuori/pen/LNyYBM

M Wuori
quelle
min und max sind hier so gut wie nutzlos, sie hindern den Benutzer nicht daran, eine unendliche Anzahl von Zahlen in das Eingabefeld einzugeben.
andreszs
Wahr. Sie sehen sie nur dann in Aktion, wenn Sie die Pfeiltasten oder die Auf- / Ab-Controller (in Chrome usw.) verwenden. Sie können diese Attribute weiterhin verwenden, um sie in Ihre nachfolgende Validierung einzubinden, die für mich funktioniert hat. Auf diese Weise können Sie Grenzwerte nur über Markup (i18n usw.) gegenüber JS steuern.
M Wuori
1

Ich weiß, dass es bereits eine Antwort gibt, aber wenn Sie möchten, dass sich Ihre Eingabe genau wie das maxlengthAttribut verhält oder so nah wie möglich ist, verwenden Sie den folgenden Code:

(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();
Philll_t
quelle
Ich mag dieses, habe es für meinen eigenen Gebrauch leicht optimiert (ich wollte nicht, dass Leute ein "e" in Chrom eingeben, was erlaubt ist);
Mathijs Segers
1

Chrome (technisch gesehen Blink) implementiert keine maximale Länge für <input type="number">.

Die HTML5-Spezifikation besagt, dass die maximale Länge nur für die Typen Text, URL, E-Mail, Suche, Telefon und Kennwort gilt.

pwnall
quelle
fügt nichts Nützliches zu dem hinzu, was zuvor nicht erwähnt wurde
candidJ
1

Die absolute Lösung, die ich kürzlich ausprobiert habe, ist:

<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" />
Herr Benedikt
quelle
Da dies generisches JS ist, funktioniert es überall. Ich arbeite an einem Projekt mit Angular 5 und es funktioniert wie ein Zauber. Sie können wahrscheinlich 10 Minuten damit verbringen, einen Dienst in Ihrem Winkelcode zu erstellen, damit Sie ihn im gesamten Projekt wiederverwenden können.
Herr Benedict
0

Ich werde das schnell und einfach verständlich machen!

Verwenden Sie anstelle von maxlength for type='number'(maxlength soll die maximale Anzahl von Buchstaben für eine Zeichenfolge in einem textTyp definieren) min=''und max=''.

Prost

Dat Boi Trump
quelle
0

<input type="number"> ist nur das ... eine Zahleneingabe (wenn auch nicht von einer Zeichenfolge konvertiert, um über Javascript zu schweben).

Ich vermute, es schränkt die Zeichen bei der Schlüsseleingabe durch nicht ein, maxLengthoder Ihr Benutzer könnte in einer "Schlüsselfalle" stecken bleiben, wenn er zu Beginn eine Dezimalstelle vergessen hat (Versuchen Sie, einen .at-Index zu setzen, 1wenn bereits ein <input type"text">"maxLength" -Attr erreicht wurde ). Es wird jedoch beim Senden des Formulars überprüft, wenn Sie ein maxAttribut festlegen .

Wenn Sie versuchen, eine Telefonnummer einzuschränken / zu validieren, verwenden Sie den type="tel"Wert attr / value. Es gehorcht dem maxLengthattr und ruft nur die Handynummern-Tastatur auf (in modernen Browsern), und Sie können die Eingabe auf ein Muster beschränken (dh pattern="[0-9]{10}").

daleyjem
quelle
0

Für React-Benutzer

Ersetzen Sie einfach 10 durch Ihre maximale Länge

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

maxlenght - Text vom Typ Eingabe

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

Verwenden von jQuery:

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

maxlenght - Eingabetypnummer

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);">
Hernaldo Gonzalez
quelle