Chrome'daki giriş türü = "sayı" için yok sayıldı


231

maxlengthNitelik ile çalışmıyor <input type="number">. Bu yalnızca Chrome'da olur.

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

Yanıtlar:


278

Gönderen için MDN belgelerine<input>

Değeri ise tip özelliğinde olup text, email, search, password, tel, veya url, bu özellik kullanıcının girebileceği (Unicode kod noktaları) maksimum karakter sayısını belirtir; diğer kontrol tipleri için yok sayılır.

Bu yüzden tasarım tarafından maxlengthgöz ardı edilir <input type="number">.

İhtiyaçlarınıza bağlı olarak, kullanabileceğiniz minve maxatıflarından Inon onun / onu cevabını önerildiği (Not: -9999 9999 tüm 0-4 kapsayacak gerçi bu sadece bir aralıkla, değerin değil gerçek bir karakter uzunluğunu tanımlayacaktır basamaklı sayılar) veya yeni bir patternözellikle normal bir metin girişi kullanabilir ve doğrulamayı zorunlu kılabilirsiniz :

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

13
Ayrıca type="number", HTML 5 belirtiminden yeni bir tür olduğunu da unutmayın . İçinde test ediyoruz tarayıcı tanımazsa type="number"onu tedavi edecek şekilde type="text"hangi gelmez saygı maxlengthniteliği. Bu, gördüğünüz davranışı açıklayabilir.
— André Dion

8
@fooquency, tam burada değilsiniz, çünkü öznitelik type=numberayarlayarak "klavye girişi" fiziksel uzunluğunu girişle sınırlayamazsınız max. Bu özellik yalnızca girişin döndürücüsü tarafından seçilen sayıyı kısıtlar.
— Kamilius

5
\d*burada ne var
— Pardeep Jain

4
pattern = "\ d *" IE11 veya Firefox 56'da çalışmıyor. jsfiddle.net/yyvrz84v
— Reado

4
Kullanmak regexve desen inanılmaz derecede yaratıcı. Ancak mobilde, farklı değil Androidveya iOSbu bir textgirdi , bu yüzden kötü bir duruma neden oluyor UX.
— AmerllicA

215

Maksimum uzunluk, maksimum uzunluğu sınırlamak için olay <input type="number"kullanmak olduğunu bildiğim en iyi yolla çalışmaz oninput. Lütfen aşağıdaki koda bakınız.

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

Parlak. TEŞEKKÜRLER!
— taketheleap

@Guedes sürümü benim için "sayı" olarak ayarlanan test edilen tüm cihazlarda çalışır. Ancak ifadenin ikinci kısmını tam olarak anlamıyorum||0/1
— Barleby

34
@Barleby. Sadece oninput="this.value=this.value.slice(0,this.maxLength)"çalışması gerekir
— Washington Guedes

1
@ WashingtonGuedes'in yukarıdaki kodu <input type="number"> stackoverflow.com/questions/18510845/…
— David Yeiser

1
Başlıca sıfırların bu yaklaşımla görüntülenmediğine dikkat edin!
— HadidAli

53

Birçok adam hiç çalışmayan bironKeyDown() olay yayınladı yani sınıra ulaştığınızda silemezsiniz. Yani kullanmak yerine ve gayet iyi çalışıyor.onKeyDown()onKeyPress()

Aşağıda çalışma kodu:

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
Bu çok yararlı, html5 numbergiriş türü tutarken diğer cevaplardan daha kısa ve çok daha iyi
— Dexter Bengil

4
Denedim, 4 basamak girdikten sonra, metin kutusu, herhangi bir güncelleme için yer olmadan donuyor, ne silme ne de geri alma tuşları çalışıyor, hiçbir şey çalışmıyor, herhangi bir rakamı nasıl düzenleyeceğinizi lütfen belirtin.
— Abbas

1
Snippet'e girebildim (1.2.3.4.5.5.6.76.7)
— Alaa

1
Bu kabul edilen cevap olmalı. Sayı alanı tutmak için çok akıllı bir yol. Döndürme düğmeleri kullanılıyorsa yine de 4 basamağın üzerine çıkabileceğinden, bir min / max özelliği eklediğinizden emin olun
— NiallMitch14

3
9999 yazdığınızda ve girişte yukarı düğmesine bastığınızda çalışmaz.
— Csaba Gergely

37

Bunu yapmanın iki yolu var

İlk olarak type="tel", Kullanım , type="number"mobil cihazlarda olduğu gibi çalışacak ve maksimum uzunluğu kabul edecektir:

<input type="tel" />

İkincisi: Biraz JavaScript kullanın:

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

2
ikinci cevabınız çok iyi değil: 2 karaktere ulaştıysanız, hiçbir rakamı silemezsiniz.
— vtni

Evet, ayrıca bir Number girdisinin değer döndürmediğini fark ettim. Uzunluk, yine de, Backspace
— anahtar kodu

2
dizi tuşları ve sil (ileri) düğmesi de dahil edilmelidir.
— vtni

Bu çok hoş. ve bu sadece benim için çalışıyor .. önerilen
— saleem ahmed

1
Harika cevap, tnx. Ancak, bu durumda 'sayı' yerine 'tel' kullanma nedenini alamıyorum. Ayrıca, kullanıcının yalnızca rakam girmesini devre dışı bırakmak için doğal numebrs durumunda "event.keyCode! = 8" durumunuzu "event.keyCode> 47 && event.keyCode <58" ile değiştirebilirsiniz.
— Dudi

28

Sen kullanabilirsiniz min ve max özelliklerini.

Aşağıdaki kod aynı şeyi yapar:

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

2
Bunun doğru cevap olması gerektiğini söyleyebilirim. Daha sonra Chrome, min / maks parametrelerine göre kutuyu anlamlı bir şekilde yeniden boyutlandırır.
— fooquency

71
Bununla birlikte, uzunluk sınırlaması eklemek istiyorsanız 9999, kullanıcının bu uzunluğu aşan bir sayıyı elle yazabileceği sayıyı aşamazsınız.
— Philll_t

10

Giriş türünüzü metne değiştirin ve işlevi çağırmak için "oninput" olayını kullanın:

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

Şimdi kullanıcı girişini filtrelemek ve yalnızca sayılarla sınırlamak için Javascript Regex'i kullanın:

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
en iyi "sadece numaralar" cevabını buldum. Evt.keycode kullanan diğerleri benim android üzerinde başarısız gibi görünüyor
— deebs

1
Çok küçük bir mod, "this.id" yerine "this", numberOnly (id) 'i numberOnly (element) olarak değiştirin, sonra numberOnly öğesinin ilk satırına ihtiyacınız yoktur ve bir id olmadan çalışır
— tony

8

Bir keresinde aynı problemle karşılaştım ve bu çözümü ihtiyaçlarıma göre buldum. Bazılarına yardımcı olabilir.

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

Mutlu Kodlama :)


3

Uzunluk kısıtlamalı sayısal giriş için de bunu deneyebilirsiniz

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

8
bazı tarayıcılarda (özellikle mobil), telgiriş otomatik olarak bu şekilde doğrulanır ve bazı garip durumlarda önde gelen 0s olarak değiştirilir 1.
— 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

İşte benim jQuery ile benim çözüm ... Giriş türü = sayı maxlength eklemek zorunda

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

Ve kopyalama ve yapıştırma işlemlerini gerçekleştirin:

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

Umarım birine yardımcı olur.


Ben de ("giriş" olayı kullansam) aynı fikri vardı, ama @WashingtonGuedes başka bir cevap için bir yorum yazdı çözüm çok daha basit this.value = this.value.slice(0, this.maxLength);olduğunu düşünüyorum : Bunun herhangi bir sorun olduğunu düşünüyor musunuz? Şimdiye kadar bulamadım. Yapıştırılan metni de kapsar.
— nonzaprej

Uzun yolu seviyorum. RegExp kullanımı çok esnektir.
— harley81

2

Deneyimlerime göre, insanların neden maxlengthgöz ardı edildiğini sorduğu sorunların çoğu , kullanıcının "izin verilen" karakter sayısından daha fazlasını girmesine izin verilmesidir.

Diğer yorumların belirttiği gibi, type="number"girdilerin bir maxlengthniteliği yoktur ve bunun yerine bir minvemax niteliği vardır.

Alanın, form gönderilmeden önce kullanıcının bunu bilmesine izin verirken eklenebilecek karakter sayısını sınırlaması için (tarayıcı değeri aksi takdirde> max belirtmelidir), (en azından şimdilik) dinleyici alanı.

İşte geçmişte kullandığım bir çözüm: http://codepen.io/wuori/pen/LNyYBM


min ve max burada işe yaramaz derecede iyidir, kullanıcının giriş alanına sonsuz sayıda sayı yazmasını engellemez.
— andreszs

Doğru. Bunları çalışırken gördüğünüz tek zaman ok tuşlarını veya yukarı / aşağı denetleyicileri (Chrome'da vb.) Kullanmaktır. Bu öznitelikleri, benim için çalışan sonraki doğrulamanıza bağlamak için yine de kullanabilirsiniz. Bu, yalnızca JS'ye karşı biçimlendirme (i18n vb.) İle sınırları kontrol etmenizi sağlar.
— M Wuori

1

Zaten bir yanıt olduğunu biliyorum, ancak girişinizin tam olarak maxlengthöznitelik gibi davranmasını veya olabildiğince yakın olmasını istiyorsanız, aşağıdaki kodu kullanın:

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

Bunu beğendim, kendi kullanımım için biraz değiştirdim, (insanların kromda bir "e" yazmasına izin vermedim);
— Mathijs Segers


1

Son zamanlarda denediğim mutlak çözüm:

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

Bu genel JS olduğundan, her yerde çalışır. Angular 5 kullanan bir proje üzerinde çalışıyorum ve bu bir cazibe gibi çalışıyor. Açılı kodunuzda bir hizmet oluşturmak için 10 dakikanızı harcayarak projeniz boyunca yeniden kullanabilirsiniz.
— Bay Benedict

0

Bunu hızlı ve kolay anlaşılır hale getireceğim!

İçin maxlength yerine type='number'(maxlength, bir texttürdeki bir dize için maksimum harf miktarını tanımlamak içindir ) min=''vemax='' .

Şerefe


0

<input type="number"> sadece ... bir sayı girişi (bir dizeden Javascript aracılığıyla yüzdürülmesine rağmen).

Tahminimce, tuş girişindeki karakterleri kısıtlamıyor maxLengthveya başlangıcında bir ondalık unutmuşlarsa kullanıcınız bir "tuş tuzağına" sıkışmış olabilir ( Bir "maxLength" attr'e ulaşıldığında bir .indeks koymayı deneyin ). Ancak, bir form ayarlarsanız form gönderimi doğrulanır.1<input type"text">max özellik .

Bir telefon numarasını kısıtlamaya / doğrulamaya çalışıyorsanız, type="tel"attr / değerini kullanın . Attreye uyuyor maxLengthve sadece mobil numara klavyesini getiriyor (modern tarayıcılarda) ve girişi bir desenle kısıtlayabilirsiniz (yani pattern="[0-9]{10}").


0

React kullanıcıları için,

Sadece 10'u maksimum uzunluk gereksiniminizle değiştirin

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

-1

maxlenght - giriş türü metni

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

jQuery kullanarak:

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

maxlenght - giriş tipi numarası

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);">
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.