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.