maxlength diabaikan untuk tipe input = "angka" di Chrome

231

The maxlengthatribut tidak bekerja dengan <input type="number">. Ini hanya terjadi di Chrome.

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

Jawaban:

277

Dari dokumentasi MDN untuk<input>

Jika nilai dari jenis atribut text, email, search, password, tel, atau url, atribut ini menentukan jumlah maksimum karakter (di Unicode poin kode) bahwa pengguna dapat memasukkan; untuk tipe kontrol lainnya, ini diabaikan.

Jadi maxlengthdiabaikan <input type="number">oleh desain.

Tergantung pada kebutuhan Anda, Anda dapat menggunakan mindan maxatribut sebagai inon disarankan dalam / nya jawabannya (NB: ini hanya akan menentukan rentang dibatasi, tidak panjang karakter yang sebenarnya dari nilai, meskipun -9.999-9999 akan mencakup semua 0-4 angka digit), atau Anda dapat menggunakan input teks biasa dan memberlakukan validasi pada bidang dengan patternatribut baru :

<input type="text" pattern="\d*" maxlength="4">
André Dion
sumber
13
Perhatikan juga bahwa type="number"ini adalah tipe baru dari spesifikasi HTML 5. Jika browser Anda uji di tidak mengakui type="number"itu akan memperlakukannya sebagai type="text"yang tidak menghormati maxlengthatribut. Ini mungkin menjelaskan perilaku yang Anda lihat.
André Dion
8
@fooquency, Anda tidak berada di sini, karena Anda sebenarnya tidak dapat membatasi panjang fisik "input keyboard" menjadi type=numberinput dengan mengatur maxatribut. Atribut ini hanya membatasi jumlah yang dipilih oleh pemintal input.
Kamilius
5
ada apa \d*disini
Pardeep Jain
4
pattern = "\ d *" tidak berfungsi di IE11 atau Firefox 56. jsfiddle.net/yyvrz84v
Reado
4
Menggunakan regexdan pola adalah hal yang sangat kreatif. Tapi di ponsel, tidak ada bedanya Androidatau iOS, itu textinput sehingga menyebabkan buruk UX.
AmerllicA
215

Panjang max tidak akan bekerja dengan <input type="number"cara terbaik yang saya tahu adalah menggunakan oninputevent untuk membatasi maxlength. Silakan lihat kode di bawah ini.

<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
sumber
Cemerlang. TERIMA KASIH!
taketheleap
Versi @Guedes bekerja untuk saya di semua jenis pengaturan perangkat yang diuji untuk "angka". Namun saya tidak sepenuhnya memahami bagian kedua dari ungkapan||0/1
Barleby
34
@Barleby. Hanya oninput="this.value=this.value.slice(0,this.maxLength)"harus bekerja
Washington Guedes
1
@ WashingtonGuedes kode di atas bekerja untuk saya di <input type="number"> stackoverflow.com/questions/18510845/…
David Yeiser
1
Waspadalah bahwa angka nol di depan tidak ditampilkan dengan pendekatan ini!
HadidAli
53

Banyak orang memposting onKeyDown()acara yang tidak berfungsi sama sekali yaitu Anda tidak dapat menghapus begitu Anda mencapai batas. Jadi, alih-alih onKeyDown()menggunakan onKeyPress()dan berfungsi dengan sangat baik.

Di bawah ini adalah kode kerja:

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
sumber
3
ini sangat membantu, lebih pendek dan jauh lebih baik daripada jawaban lain di sini sambil menjaga numbertipe input html5
Dexter Bengil
4
Saya mencoba, setelah memasukkan 4 digit, kotak teks, hanya membeku tanpa ruang untuk pembaruan apa pun, tidak ada tombol hapus atau backspace yang berfungsi, tidak ada yang berhasil, cara mengedit angka apa pun, sebutkan.
Abbas
1
Saya dapat memasukkan cuplikan Anda (1.2.3.4.5.5.6.76.7)
Alaa
1
Ini harus menjadi jawaban yang diterima. Cara yang sangat cerdas untuk menjaga bidang angka. Pastikan untuk menambahkan atribut min / max karena tombol putar masih dapat melampaui 4 digit jika digunakan
NiallMitch14
3
Tidak berfungsi saat Anda mengetik 9999 dan menekan tombol atas pada input.
Csaba Gergely
37

Saya punya dua cara untuk Anda melakukannya

Pertama: Gunakan type="tel", ini akan berfungsi seperti type="number"di seluler, dan menerima panjang maksimal:

<input type="tel" />

Kedua: Gunakan sedikit JavaScript:

<!-- maxlength="2" -->
<input type="tel" onKeyDown="if(this.value.length==2 && event.keyCode!=8) return false;" />
Maycow Moura
sumber
2
jawaban kedua Anda tidak terlalu bagus: jika Anda mencapai 2 karakter, Anda tidak dapat menghapus nomor apa pun.
vtni
Ya, saya juga melihat input Angka tidak mengembalikan nilai. Panjang, bagaimanapun, saya mengeditnya termasuk kode kunci Backspace
Maycow Moura
2
tombol larik dan tombol hapus (maju) juga harus disertakan.
vtni
Ini bagus. dan ini hanya bekerja untuk saya..dipilih
saleem
1
Jawaban bagus, tnx. Namun, saya tidak mendapatkan alasan untuk menggunakan 'tel' daripada 'angka' dalam kasus ini. Selain itu, Anda dapat mengganti kondisi "event.keyCode! = 8" dengan "event.keyCode> 47 && event.keyCode <58" dalam kasus numebr alami untuk menonaktifkan pengguna hanya dari memasukkan angka.
Dudi
28

Anda dapat menggunakan atribut min dan max .

Kode berikut melakukan hal yang sama:

<input type="number" min="-999" max="9999"/>
inon
sumber
2
Saya akan mengatakan ini harus menjadi jawaban yang benar di sini. Chrome setidaknya kemudian mengubah ukuran kotak dengan masuk akal berdasarkan parameter min / maks.
fooquency
70
Ini tidak berfungsi jika Anda ingin menambahkan batasan panjang, sementara Anda tidak akan dapat melebihi angka 9999yang dapat diketik pengguna secara manual dalam angka yang melebihi panjang itu.
Philll_t
10

Ubah tipe input Anda menjadi teks dan gunakan fungsi "oninput" untuk memanggil fungsi:

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

Sekarang gunakan Javascript Regex untuk memfilter input pengguna dan batasi hanya pada angka:

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
sumber
1
jawaban "hanya angka" terbaik yang saya temukan. Orang lain yang menggunakan evt.keycode tampaknya gagal di android saya
deebs
1
Satu mod yang sangat kecil, ubah "this.id" menjadi "this", numberOnly (id) ke numberOnly (elemen), maka Anda tidak perlu baris pertama dari numberOnly dan berfungsi tanpa id
tony
8

Saya pernah mengalami masalah yang sama dan menemukan solusi ini sehubungan dengan kebutuhan saya. Mungkin membantu Seseorang.

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

Selamat Coding :)

Mohammad Mahroz
sumber
3

Anda dapat mencoba ini juga untuk input numerik dengan batasan panjang

<input type="tel" maxlength="4" />
shinobi
sumber
8
di beberapa browser (khusus ponsel), telinput akan secara otomatis divalidasi seperti itu dan dalam beberapa kasus aneh 0s terkemuka akan diubah menjadi 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

Surya R Praveen
sumber
3

Ini adalah solusi saya dengan jQuery ... Anda harus menambahkan maxlength ke input type = number Anda

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

Dan menangani salin dan tempel:

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

Saya harap ini membantu seseorang.

harley81
sumber
Saya memiliki ide yang sama (walaupun saya menggunakan acara "input"), tetapi saya pikir solusi yang ditulis oleh @WashingtonGuedes dalam komentar untuk jawaban lain jauh lebih sederhana: this.value = this.value.slice(0, this.maxLength);Apakah Anda pikir ini memiliki masalah? Saya belum menemukan sejauh ini. Ini mencakup teks yang disisipkan juga.
nonzaprej
Saya suka jauh. Penggunaan RegExp sangat fleksibel.
harley81
2

Dalam pengalaman saya kebanyakan masalah di mana orang bertanya mengapa maxlengthdiabaikan adalah karena pengguna diizinkan untuk memasukkan lebih dari jumlah karakter yang "diizinkan".

Seperti komentar lain katakan, type="number"input tidak memiliki maxlengthatribut dan, sebaliknya, memiliki atribut mindan max.

Agar bidang membatasi jumlah karakter yang dapat dimasukkan sambil memungkinkan pengguna mengetahui hal ini sebelum formulir dikirimkan (browser harus mengidentifikasi nilai> maks jika tidak), Anda harus (untuk saat ini, setidaknya) menambahkan pendengar ke lapangan.

Berikut ini adalah solusi yang pernah saya gunakan: http://codepen.io/wuori/pen/LNyYBM

M Wuori
sumber
min dan maks sama baiknya dengan tidak berguna di sini, mereka tidak mencegah pengguna mengetik jumlah yang tidak terbatas pada bidang input.
andreszs
Benar. Satu-satunya saat Anda melihat mereka beraksi adalah ketika Anda menggunakan tombol panah atau pengontrol atas / bawah (di Chrome, dll.). Anda masih dapat menggunakan atribut ini untuk mengikat ke validasi Anda berikutnya, yang telah bekerja untuk saya. Ini memungkinkan Anda untuk mengontrol batas melalui markup (i18n, dll.) Vs. JS saja.
M Wuori
1

Saya tahu sudah ada jawaban, tetapi jika Anda ingin input Anda berperilaku persis seperti maxlengthatribut atau sedekat mungkin, gunakan kode berikut:

(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
sumber
Saya suka yang ini, Tweak sedikit untuk penggunaan saya sendiri, (Saya tidak ingin orang mengetik "e" di chrome, yang diizinkan);
Mathijs Segers
1

Chrome (secara teknis, Blink) tidak akan menerapkan panjang maksimum untuk <input type="number">.

Spesifikasi HTML5 mengatakan bahwa maxlength hanya berlaku untuk jenis teks, url, email, pencarian, tel, dan kata sandi.

pwnall
sumber
tidak menambahkan sesuatu yang berguna pada apa yang belum disebutkan sebelumnya
candidJ
1

Solusi absolut yang baru saja saya coba adalah:

<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" />
Tuan Benedict
sumber
Karena ini adalah JS generik, ini akan berfungsi di mana saja. Saya sedang mengerjakan sebuah proyek menggunakan Angular 5 dan itu bekerja seperti pesona. Anda mungkin dapat menghabiskan 10 menit membuat layanan dalam kode sudut Anda sehingga Anda dapat menggunakannya kembali di seluruh proyek Anda.
Tn. Benedict
0

Saya akan membuat ini cepat dan mudah dimengerti!

Alih-alih maxlength untuk type='number'(maxlength dimaksudkan untuk menentukan jumlah maksimum huruf untuk string dalam suatu texttipe), gunakan min=''dan max=''.

Bersulang

Dat Boi Trump
sumber
0

<input type="number"> hanya saja ... sejumlah input (meskipun, tidak dikonversi dari string ke float via Javascript).

Dugaan saya, itu tidak membatasi karakter pada input kunci oleh maxLengthatau pengguna Anda bisa terjebak dalam "jebakan kunci" jika mereka lupa desimal di awal (Coba letakkan .indeks at 1ketika <input type"text">attr "maxLength" telah tercapai ). Namun itu akan memvalidasi pada formulir kirim jika Anda menetapkan maxatribut.

Jika Anda mencoba membatasi / memvalidasi nomor telepon, gunakan type="tel"attr / nilai. Ini mematuhi maxLengthattr dan menampilkan keyboard nomor ponsel saja (di browser modern) dan Anda dapat membatasi input ke suatu pola (yaitu pattern="[0-9]{10}").

daleyjem
sumber
0

Untuk pengguna Bereaksi,

Cukup ganti 10 dengan persyaratan panjang maks

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

maxlenght - tipe input teks

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

menggunakan jQuery:

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

maxlenght - nomor tipe 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);">
Hernaldo Gonzalez
sumber