Chrome에서 입력 유형 =“번호”에 대해 maxlength가 무시 됨


231

maxlength속성은 작동하지 않습니다 <input type="number">. 이것은 Chrome에서만 발생합니다.

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

답변:


277

대한 MDN의 설명서에서<input>

값의 경우 유형 속성은 text, email, search, password, tel, 또는 url이러한 특성은 사용자가 입력 할 수있는 (유니 코드 코드 포인트)의 최대 문자 수 지정; 다른 제어 유형의 경우 무시됩니다.

따라서 설계 maxlength상 무시됩니다 <input type="number">.

필요에 따라, 당신은을 사용할 수 있습니다 minmax같은 속성 이논 그 / 그녀의 대답에 제안 (주의 : -9999 ~ 9999 모두 0-4 다룰 것입니다하지만 이것은 단지, 제한된 범위의 값이 아닌 실제 문자 길이를 정의합니다 자릿수) 또는 일반 텍스트 입력을 사용하고 새 pattern속성 을 사용하여 필드에서 유효성을 검사 할 수 있습니다 .

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

13
또한 type="number"HTML 5 사양의 새로운 유형입니다. 당신이 테스트중인 브라우저가 인식하지 못하는 경우 type="number"그것을 취급으로 type="text"하는 않는 존경 maxlength속성을. 이것은 당신이보고있는 행동을 설명 할 수 있습니다.
André Dion

8
@fooquency, 속성 type=number을 설정 하여 실제로 "키보드 입력"의 실제 길이를 입력으로 제한 할 수 없으므로 여기에 없습니다 max. 이 속성은 입력 스피너가 선택한 숫자 만 제한합니다.
Kamilius

5
여기는 무엇 \d*입니까?
Pardeep Jain

4
pattern = "\ d *"는 IE11 또는 Firefox 56에서 작동하지 않습니다. jsfiddle.net/yyvrz84v
Reado

4
사용 regex및 패턴은 엄청나게 독창적입니다. 그러나, 모바일 다르지에서 Android또는 iOS, 그것은이다 text이 나쁜 원인이 때문에 입력 UX.
AmerllicA

215

최대 길이는 <input type="number"내가 아는 가장 좋은 방법으로 작동하지 않으므로 최대 길이 oninput를 제한하는 이벤트를 사용 하는 것입니다. 아래 코드를 참조하십시오.

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

훌륭한. 감사!
가져 가라

@Guedes 버전은 모든 테스트 된 장치 설정 유형을 "숫자"로 설정합니다. 그러나 나는 표현의 두 번째 부분을 완전히 이해하지 못한다||0/1
Barleby

34
@ 발레 비 그냥 oninput="this.value=this.value.slice(0,this.maxLength)"작동합니다
워싱턴 오 Guedes

1
<input type="number">
@WashingtonGuedes

1
이 접근 방식에서는 선행 0이 표시되지 않습니다!
HadidAli

53

많은 사람들 onKeyDown()전혀 작동하지 않는 이벤트를 게시 했습니다. 즉, 한도에 도달하면 삭제할 수 없습니다. 그래서 대신에 onKeyDown()사용onKeyPress() 하고 완벽하게 잘 작동합니다.

아래는 작업 코드입니다.

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
이것은 매우 도움이되는 짧고 훨씬 더 다른 답변보다 여기에 HTML5를 유지하면서 number입력 타입
덱스터 Bengil

4
텍스트 상자에 4 자리 숫자를 입력 한 후에는 업데이트 할 공간이 없어 고정되거나 삭제되거나 백 스페이스 키가 작동하지 않으며 아무 것도 작동하지 않으며 숫자를 편집하는 방법을 언급하십시오.
Abbas

1
나는 스 니펫 (1.2.3.4.5.5.6.76.7)에 들어갈 수 있었다
Alaa '

1
이것이 정답입니다. 숫자 필드를 유지하는 매우 영리한 방법. 스핀 버튼을 사용하는 경우 스핀 버튼이 여전히 4 자리를
넘어갈

3
9999를 입력하고 입력시 위로 버튼을 누르면 작동하지 않습니다.
Csaba Gergely

37

두 가지 방법이 있습니다

첫째 : 사용 type="tel"하면 type="number"모바일 에서처럼 작동 하고 최대 길이를 허용합니다.

<input type="tel" />

둘째 : 약간의 JavaScript를 사용하십시오.

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

2
두 번째 대답은 좋지 않습니다. 2 자에 도달하면 숫자를 삭제할 수 없습니다.
vtni

예, 또한 번호 입력 어쨌든, value.length을 반환하지 않습니다 발견, 나는 백 스페이스 키 코드를 포함하여 그것을 편집
Maycow 모 우라에게

2
배열 키와 삭제 (앞으로) 버튼도 포함해야합니다.
vtni

이것은 좋은 것입니다. 이 단지 me..upvoted 근무
살림 아메드

1
좋은 대답, tnx. 그러나이 경우 'number'대신 'tel'을 사용해야 할 이유가 없습니다. 또한 자연 숫자가있는 경우 "event.keyCode! = 8"조건을 "event.keyCode> 47 && event.keyCode <58"로 바꾸면 숫자 만 입력 할 수 없게됩니다.
Dudi

28

minmax 속성을 사용할 수 있습니다 .

다음 코드도 동일합니다.

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

2
나는 이것이 정답이라고 말하고 싶다. 그런 다음 Chrome은 최소한 최소 / 최대 매개 변수에 따라 상자의 크기를 눈에 띄게 조정합니다.
fooquency

70
길이 제한을 추가하려는 경우에는 작동하지 않지만 9999사용자가 해당 길이를 초과하는 숫자를 수동으로 입력 할 수있는 수를 초과 할 수는 없습니다 .
Philll_t 2016 년

10

입력 유형을 텍스트로 변경하고 "oninput"이벤트를 사용하여 함수를 호출하십시오.

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

이제 Javascript Regex를 사용하여 사용자 입력을 필터링하고 숫자로만 제한하십시오.

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

데모 : https://codepen.io/aslami/pen/GdPvRY


1
내가 찾은 최고의 "숫자 만"답변. evt.keycode를 사용하는 다른 사람들은 내 안드로이드에서 실패한 것 같습니다
deebs

1
하나는 아주 작은 모드, 변경은 "이", numberOnly (요소)에 numberOnly (ID)를, 다음 numberOnly의 첫 번째 줄을 필요로하지 않으며 그것이 ID없이 작동에 "this.id"
토니

8

한 번 같은 문제가 발생하여 내 요구와 관련 하여이 솔루션을 찾았습니다. 도움이 될 수 있습니다.

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

행복한 코딩 :)


3

길이 제한이있는 숫자 입력 에도이 방법을 시도 할 수 있습니다

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

8
일부 브라우저 (특히 모바일)에서는 tel입력이 자동으로 확인되며, 이상한 경우 앞에 0s가 s로 변경됩니다 1.
Philll_t 2016 년

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

데모 -JSFIDDLE


3

여기 jQuery와 함께 내 솔루션이 있습니다 ... 입력 유형 = 숫자에 maxlength를 추가해야합니다

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

그리고 복사하여 붙여 넣기를 처리하십시오.

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

누군가에게 도움이되기를 바랍니다.


나는 같은 생각을 가지고 있었지만 ( "입력"이벤트를 사용 했음에도 불구하고) @WashingtonGuedes가 다른 답변에 대한 코멘트로 작성한 솔루션이 훨씬 간단 this.value = this.value.slice(0, this.maxLength);하다고 생각합니다. 문제가 있다고 생각하십니까? 나는 지금까지 찾지 못했습니다. 붙여 넣은 텍스트도 포함합니다.
nonzaprej

나는 먼 길을 좋아한다. RegExp의 사용법은 매우 유연합니다.
harley81

2

내 경험상 사람들이 왜 maxlength무시 되는지 묻는 대부분의 문제 는 사용자가 "허용 된"문자 수 이상을 입력 할 수 있기 때문입니다.

다른 의견에서 언급했듯이 type="number"입력에는 maxlength속성 이 없으며 대신 minand max속성이 있습니다.

양식을 제출하기 전에 사용자가이를 인식 할 수 있도록하는 동안 삽입 할 수있는 문자의 수를 필드가 제한하게하려면 (브라우저는 값> max를 식별해야 함) 적어도 (지금은) 필드 청취자.

과거에 사용한 솔루션은 다음과 같습니다. http://codepen.io/wuori/pen/LNyYBM


여기서 최소값과 최대 값은 쓸모가 없지만 사용자가 입력 필드에 무한한 수의 숫자를 입력하지 못하게합니다.
andreszs

진실. 화살표 키나 위 / 아래 컨트롤러 (Chrome 등)를 사용하는 경우에만 작동합니다. 이러한 속성을 계속 사용하여 후속 유효성 검사에 연결할 수 있습니다. 이를 통해 마크 업 (i18n 등)과 JS만을 통해 한계를 제어 할 수 있습니다.
M Wuori

1

이미 답변이 있지만 입력 내용이 maxlength속성 과 똑같이 또는 최대한 가깝게 동작 하도록하려면 다음 코드를 사용하십시오.

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

나는 이것을 좋아하고, 내가 사용하기 위해 약간 조정했다. (크롬에서 "e"를 입력하는 것을 원하지 않았다.)
Mathijs Segers


1

내가 최근에 시도한 절대적인 해결책은 다음과 같습니다.

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

이것은 일반적인 JS이므로 어디에서나 작동합니다. Angular 5를 사용하여 프로젝트를 진행 중이며 매력처럼 작동합니다. 각도 코드로 서비스를 작성하는 데 10 분을 소비하여 프로젝트 전체에서 재사용 할 수 있습니다.
Mr. Benedict

0

나는 이것을 빠르고 이해하기 쉽게 만들 것입니다!

maxlength 대신 type='number'(maxlength는 text유형 의 문자열에 대한 최대 문자 수를 정의 하기위한 것입니다) 대신 min=''and를 사용하십시오 max=''.

건배


0

<input type="number"> 그냥 ... 숫자 입력 (문자열에서 Javascript를 통해 부동으로 변환되지는 않지만)입니다.

내 생각에, 그것은 키 입력의 문자를 제한하지 않거나 maxLength사용자가 처음에 소수점을 잊어 버린 경우 "키 트랩"에 갇힐 수 있습니다 ( "maxLength"attr에 이미 도달 했을 때 .at at index를 시도하십시오) ). 그러나 속성 을 설정하면 양식 제출시 유효성이 검사됩니다 .1<input type"text">max

전화 번호를 제한 / 확인하려는 경우 type="tel"attr / value를 사용하십시오 . maxLengthattr을 준수하고 휴대 전화 키보드 만 제공합니다 (최신 브라우저). 입력을 패턴 (예 :)으로 제한 할 수 있습니다 pattern="[0-9]{10}".


0

React 사용자의 경우

최대 길이 요구 사항으로 10을 교체하십시오.

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

-1

maxlenght-입력 유형 텍스트

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

jQuery를 사용하여 :

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

maxlenght-입력 유형 번호

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);">
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.