maxlength bị bỏ qua cho loại đầu vào = Số hiệu Số trong Chrome


231

Các maxlengththuộc tính không được làm việc với <input type="number">. Điều này chỉ xảy ra trong Chrome.

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

Câu trả lời:


277

Từ tài liệu của MDN cho<input>

Nếu giá trị của các loại thuộc tính là text, email, search, password, tel, hay url, thuộc tính này xác định số ký tự tối đa (tại các điểm mã Unicode) mà người dùng có thể nhập; đối với các loại điều khiển khác, nó bị bỏ qua.

Vì vậy, maxlengthđược bỏ qua trên <input type="number">thiết kế.

Tùy thuộc vào nhu cầu của bạn, bạn có thể sử dụng minmaxcác thuộc tính như inon đề xuất trong / câu trả lời của mình (NB: điều này sẽ chỉ xác định một phạm vi ràng buộc, không phải là chiều dài nhân vật thực tế của giá trị, mặc dù -9.999-9999 sẽ bao gồm tất cả 0-4 số chữ số) hoặc bạn có thể sử dụng kiểu nhập văn bản thông thường và thực thi xác thực trên trường với patternthuộc tính mới :

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

13
Cũng lưu ý rằng đó type="number"là một loại mới từ đặc tả HTML 5. Nếu trình duyệt bạn đang thử nghiệm trong không nhận ra type="number"nó sẽ đối xử với nó như type="text"đó không tôn trọng các maxlengththuộc tính. Điều này có thể giải thích hành vi bạn nhìn thấy.
André Dion

8
@fooquency, bạn không ở đây, vì bạn thực sự không thể hạn chế độ dài vật lý của "đầu vào bàn phím" vào type=numberđầu vào bằng cách đặt maxthuộc tính. Thuộc tính này chỉ giới hạn số được chọn bởi spinner của đầu vào.
Kamilius

5
cái gì \d*đây
Pardeep Jain

4
mẫu = "\ d *" không hoạt động trong IE11 hoặc Firefox 56. jsfiddle.net/yyvrz84v
Reado

4
Sử dụng regexvà mô hình là một sáng tạo đáng kinh ngạc. Nhưng trong điện thoại di động, không có gì khác biệt Android, hoặc iOSđó là một textđầu vào nên nó gây ra lỗi xấu UX.
AmerllicA

215

Độ dài tối đa sẽ không hoạt động với <input type="number"cách tốt nhất mà tôi biết là sử dụng oninputsự kiện để giới hạn mức tối đa. Xin vui lòng xem mã dưới đây.

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

Xuất sắc. CẢM ƠN!
taketheleap

Phiên bản @Guedes hoạt động với tôi trong tất cả các loại cài đặt thiết bị được thử nghiệm thành "số". Tuy nhiên tôi không hiểu hết phần thứ hai của biểu thức||0/1
Barleby

34
@Barleby. Chỉ oninput="this.value=this.value.slice(0,this.maxLength)"nên làm việc
Washington Guedes

1
Mã của @ WashingtonGuedes ở trên đã làm việc cho tôi trên <input type="number"> stackoverflow.com/questions/18510845/iêu
David Yeiser

1
Coi chừng các số 0 hàng đầu không được hiển thị với phương pháp này!
HadidAli

53

Nhiều người đã đăng onKeyDown()sự kiện hoàn toàn không hoạt động, tức là bạn không thể xóa một khi bạn đạt đến giới hạn. Vì vậy, thay vì onKeyDown()sử dụng onKeyPress()và nó hoạt động hoàn toàn tốt.

Dưới đây là mã làm việc:

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
điều này rất hữu ích, ngắn hơn và tốt hơn nhiều so với bất kỳ câu trả lời nào khác ở đây trong khi vẫn giữ numberkiểu đầu vào html5
Dexter Bengil

4
Tôi đã thử, sau khi nhập 4 chữ số, hộp văn bản, đơn giản là bị đóng băng mà không có chỗ cho bất kỳ cập nhật nào, không xóa hoặc không phím phím hoạt động, không có gì hoạt động, làm thế nào để chỉnh sửa bất kỳ chữ số nào, xin vui lòng đề cập.
Abbas

1
Tôi đã có thể nhập vào đoạn trích của bạn (1.2.3.4.5.5.6.76.7)
Alaa '

1
Đây phải là câu trả lời được chấp nhận. Cách rất thông minh để giữ trường số. Chỉ cần đảm bảo thêm thuộc tính tối thiểu / tối đa vì các nút quay vẫn có thể vượt quá 4 chữ số nếu chúng được sử dụng
NiallMitch14

3
Không hoạt động khi bạn gõ 9999 và nhấn nút lên trên đầu vào.
Csaba Gergely

37

Tôi có hai cách để bạn làm điều đó

Đầu tiên: Sử dụng type="tel", nó sẽ hoạt động như type="number"trong thiết bị di động và chấp nhận tối đa:

<input type="tel" />

Thứ hai: Sử dụng một chút JavaScript:

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

2
câu trả lời thứ hai của bạn không tốt lắm: nếu bạn đạt 2 ký tự, bạn không thể xóa bất kỳ số nào.
vtni

Có, tôi cũng nhận thấy đầu vào Số không trả về giá trị. Dù sao, tôi đã chỉnh sửa nó bao gồm mã khóa Backspace
Maycow Moura

2
các phím mảng và nút xóa (chuyển tiếp) cũng nên được bao gồm.
vtni

Đây là một trong những tốt đẹp. và điều này chỉ làm việc cho tôi..cung cấp
saleem vào

1
Câu trả lời tuyệt vời, tnx. Tuy nhiên, tôi không có lý do để sử dụng 'tel' thay vì 'number' trong trường hợp này. Ngoài ra, bạn có thể thay thế điều kiện "event.keyCode! = 8" bằng "event.keyCode> 47 && event.keyCode <58" trong trường hợp chữ số tự nhiên để vô hiệu hóa người dùng chỉ nhập các chữ số.
Dudi

28

Bạn có thể sử dụng các thuộc tính tối thiểutối đa .

Các mã sau đây làm tương tự:

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

2
Tôi muốn nói rằng đây sẽ là câu trả lời chính xác ở đây. Chrome ít nhất sau đó thay đổi kích thước hộp một cách hợp lý dựa trên các tham số tối thiểu / tối đa.
fooquency

70
Tuy nhiên, điều này không hoạt động nếu bạn muốn thêm hạn chế độ dài, trong khi bạn sẽ không thể vượt quá số lượng 9999người dùng có thể nhập thủ công vào một số vượt quá độ dài đó.
Philll_t

10

Thay đổi kiểu nhập của bạn thành văn bản và sử dụng sự kiện "oninput" để gọi hàm:

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

Bây giờ sử dụng Javascript Regex để lọc đầu vào của người dùng và chỉ giới hạn ở số:

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, "");
}

Bản trình diễn: https://codepen.io/aslami/pen/GdPvRY


1
câu trả lời "chỉ số" tốt nhất mà tôi đã tìm thấy. Những người khác sử dụng evt.keycode dường như không thành công trên Android của tôi
deebs

1
Một mod rất nhỏ, thay đổi "this.id" thành "this", numberOnly (id) thành numberOnly (phần tử), sau đó bạn không cần dòng đầu tiên của numberOnly và nó hoạt động mà không có id
tony

8

Tôi đã từng gặp vấn đề tương tự và tìm thấy giải pháp này liên quan đến nhu cầu của tôi. Nó có thể giúp một số người.

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

Chúc mừng mã hóa :)


3

Bạn cũng có thể thử điều này cho đầu vào số với giới hạn độ dài

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

8
trong một số trình duyệt (cụ thể là điện thoại di động), telđầu vào sẽ được xác nhận tự động như vậy và trong một số trường hợp kỳ lạ, 0s dẫn sẽ được thay đổi thành 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 - NHẬP KHẨU


3

Đây là giải pháp của tôi với jQuery ... Bạn phải thêm maxlength vào kiểu nhập = number

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

Và xử lý sao chép và dán:

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

Tôi hy vọng nó sẽ giúp được ai đó.


Tôi có cùng một ý tưởng (mặc dù tôi đã sử dụng sự kiện "đầu vào"), nhưng tôi nghĩ giải pháp mà @WashingtonGuedes đã viết trong một bình luận cho một câu trả lời khác đơn giản hơn nhiều: this.value = this.value.slice(0, this.maxLength);Bạn có nghĩ vấn đề này có vấn đề gì không? Tôi đã không tìm thấy bất kỳ cho đến nay. Nó bao gồm văn bản dán quá.
nonzaprej

Tôi thích con đường dài. Cách sử dụng của RegExp rất linh hoạt.
harley81

2

Theo kinh nghiệm của tôi, hầu hết các vấn đề mà mọi người đang hỏi tại sao lại maxlengthbị bỏ qua là vì người dùng được phép nhập nhiều hơn số ký tự "được phép".

Như các ý kiến ​​khác đã nêu, type="number"đầu vào không có maxlengththuộc tính và thay vào đó, có một thuộc tính minmax.

Để có trường giới hạn số lượng ký tự có thể được chèn trong khi cho phép người dùng nhận thức được điều này trước khi biểu mẫu được gửi (trình duyệt nên xác định giá trị> tối đa khác), bạn sẽ phải (ít nhất là bây giờ) thêm người nghe đến hiện trường.

Đây là một giải pháp tôi đã sử dụng trong quá khứ: http://codepen.io/wuori/pen/LNyYBM


ở đây tối thiểu và tối đa là vô dụng ở đây, chúng không ngăn người dùng nhập một số lượng không xác định trong trường đầu vào.
andreszs

Thật. Lần duy nhất bạn thấy chúng hoạt động là khi bạn đang sử dụng các phím mũi tên hoặc bộ điều khiển lên / xuống (trong Chrome, v.v.). Bạn vẫn có thể sử dụng các thuộc tính này để liên kết với xác nhận tiếp theo của bạn, điều này đã làm việc cho tôi. Điều này cho phép bạn kiểm soát các giới hạn thông qua đánh dấu (i18n, v.v.) so với chỉ JS.
M Wuori

1

Tôi biết đã có câu trả lời, nhưng nếu bạn muốn đầu vào của mình hoạt động chính xác như maxlengththuộc tính hoặc gần nhất có thể, hãy sử dụng mã sau:

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

Tôi thích cái này, Tinh chỉnh nó một chút cho mục đích sử dụng của riêng tôi, (tôi không muốn mọi người gõ "e" bằng chrome, được phép);
Mathijs Segers

1

Chrome (về mặt kỹ thuật, Blink) sẽ không triển khai tối đa cho <input type="number">.

Đặc tả HTML5 nói rằng maxlength chỉ có thể áp dụng cho các loại văn bản, url, e-mail, tìm kiếm, tel và mật khẩu.


không thêm bất cứ điều gì hữu ích vào những gì chưa được đề cập trước đó
candJ

1

Giải pháp tuyệt đối mà tôi vừa mới thử là:

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

Bởi vì đây là JS chung, nó sẽ hoạt động ở mọi nơi. Tôi đang làm việc trên một dự án sử dụng Angular 5 và nó hoạt động như một cơ duyên. Bạn có thể có thể dành 10 phút để tạo một dịch vụ theo mã góc của bạn để bạn có thể sử dụng lại nó trong suốt dự án của bạn.
Ông Benedict

0

Tôi sẽ làm điều này nhanh chóng và dễ hiểu!

Thay vì maxlength cho type='number'(maxlength có nghĩa là xác định số lượng chữ cái tối đa cho một chuỗi trong một textloại), hãy sử dụng min=''max=''.

Chúc mừng


0

<input type="number"> chỉ là ... một đầu vào số (mặc dù, không được chuyển đổi từ một chuỗi để nổi qua Javascript).

Tôi đoán, nó không hạn chế các ký tự trên đầu vào khóa bởi maxLengthnếu không người dùng của bạn có thể bị kẹt trong "bẫy khóa" nếu họ quên một số thập phân ngay từ đầu (Hãy thử đặt một .chỉ mục 1khi <input type"text">đã đạt đến mức "maxLạng" ). Tuy nhiên, nó sẽ xác nhận trên biểu mẫu gửi nếu bạn đặt một maxthuộc tính.

Nếu bạn đang cố gắng hạn chế / xác thực số điện thoại, hãy sử dụng type="tel"attr / value. Nó tuân theo maxLengthattr và chỉ hiển thị bàn phím số di động (trong các trình duyệt hiện đại) và bạn có thể hạn chế nhập vào một mẫu (tức là pattern="[0-9]{10}").


0

Đối với người dùng React,

Chỉ cần thay thế 10 với yêu cầu chiều dài tối đa của bạn

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

-1

maxlenght - văn bản loại đầu vào

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

sử dụng jQuery:

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

maxlenght - số loại đầu vào

Mã não

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);">
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.