Chrome中输入类型=“ number”的maxlength被忽略


Answers:


277

MDN的文档中<input>

如果值类型属性是textemailsearchpasswordtel,或url,此属性指定的最大字符数(在Unicode代码点),用户可以输入; 对于其他控件类型,将忽略它。

因此maxlength<input type="number">设计上被忽略。

根据您的需要,您可以按照答案中的inon建议使用minand max属性(注意:这将仅定义一个受限制的范围,而不是该值的实际字符长度,尽管-9999到9999将覆盖所有0-4位数字),也可以使用常规文本输入并使用新属性在字段上强制执行验证:pattern

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

13
还要注意,这type="number"是HTML 5规范中的一种新类型。如果你在测试浏览器不能识别type="number"它将把它作为type="text"尊重maxlength属性。这可以解释您所看到的行为。
安德烈·迪翁

8
@fooquency,您不正确,因为您实际上无法type=number通过设置max属性将“键盘输入”的物理长度限制为输入。此属性仅限制输入的微调器选择的数字。
Kamilius

5
这是\d*什么?
Pardeep Jain

4
pattern =“ \ d *”在IE11或Firefox 56中不起作用。jsfiddle.net/yyvrz84v
Reado

4
使用regex和模式是一项非常有创意的工作。但是,在移动设备中,没有什么不同,Android或者iOStext输入,因此会造成不良后果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"
 />

辉煌。谢谢!
taketheleap

@Guedes版本适用于所有将设备设置为“数字”的测试设备。但是我不完全理解表达的第二部分||0/1
Barleby

34
@Barleby。只是oninput="this.value=this.value.slice(0,this.maxLength)"应该工作
华盛顿古埃德斯

1
<input type="number">
@WashingtonGuedes的

1
请注意,这种方法不会显示前导零!
哈迪阿里

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输入类型
Dexter Bengil

4
在输入4位数字后,我尝试过将文本框冻结,没有任何更新空间,删除键和退格键均无效,没有任何作用,如何编辑任何数字,请提及。
阿巴斯,

1
我能够输入您的代码段(1.2.3.4.5.5.6.76.7)
Alaa'19年

1
这应该是公认的答案。保留数字字段的非常聪明的方法。只需确保添加一个min / max属性,因为如果使用旋转按钮,它们仍然可以超过4位数字
NiallMitch14

3
当您输入9999并按输入上的向上按钮时,此功能不起作用。
Csaba Gergely,

37

我有两种方法可以做到

首先:使用type="tel",它将像type="number"在移动设备中一样工作,并接受maxlength:

<input type="tel" />

第二:使用一些JavaScript:

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

2
您的第二个答案不是很好:如果您达到2个字符,则不能删除任何数字。
vtni 2014年

是的,我还注意到一个数字输入不返回value.length,无论如何,我编辑了它,包括Backspace键代码
Maycow Moura 2014年

2
阵列键和删除(前进)按钮也应包括在内。
vtni 2014年

这很不错。而这只是工作me..upvoted
萨利姆·艾哈迈德

1
很好的答案,tnx。但是,在这种情况下,我没有理由使用“ tel”而不是“ number”。此外,在自然数字的情况下,可以将“ event.keyCode!= 8”的条件替换为“ event.keyCode> 47 && event.keyCode <58”,以禁止用户仅输入数字。
迪迪

28

您可以使用minmax属性。

以下代码执行相同的操作:

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

2
我会说这应该是正确的答案。Chrome至少会根据最小/最大参数合理地调整框的大小。
愚蠢的2014年

70
但是,如果您要添加长度限制,则此方法将不起作用,虽然您将不能超过该数字,9999但用户可以手动键入超过该长度的数字。
Philll_t 2015年

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的人似乎在我的android上失败
deebs 18-10-1

1
一个非常小的mod,将“ this.id”更改为“ this”,将numberOnly(id)更改为numberOnly(element),那么您就不需要numberOnly的第一行,并且它不需要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将更改为1s。
Philll_t 2015年


3

这是我的jQuery解决方案...您必须将maxlength添加到输入type = 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;
});

并处理复制和粘贴:

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

希望对您有所帮助。


我有相同的想法(尽管我使用了“ input”事件),但是我认为@WashingtonGuedes在对另一个答案的评论中写的解决方案要简单得多:this.value = this.value.slice(0, this.maxLength);您认为这有什么问题吗?到目前为止我还没有找到。它也涵盖粘贴的文本。
nonzaprej

我喜欢漫长的路。RegExp的用法非常灵活。
harley81 '19

2

根据我的经验,人们问为什么maxlength被忽略的大多数问题是因为允许用户输入的字符数超过了“允许的”数目。

如其他评论所述,type="number"输入内容没有maxlength属性,而是具有minand max属性。

要使该字段限制可插入的字符数,同时允许用户在提交表单之前意识到这一点(浏览器应标识value> 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();

我喜欢这个,稍作调整以供我自己使用(我不希望人们在chrome中输入“ e”,这是允许的);
Mathijs Segers,2015年


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分钟时间在角度代码中创建服务,以便可以在整个项目中重用它。
本尼迪克特先生

0

我将使它变得快速而容易理解!

代替的最大长度为type='number'(最大长度是指,以限定用于在一个串的字母的最大量text型),使用min=''max=''

干杯


0

<input type="number"> 仅仅是...一个数字输入(尽管没有从字符串转换为通过Javascript浮动)。

我的猜测是,它不会限制按键输入的字符,maxLength否则如果用户在开始时忘记了小数,则用户可能会陷入“按键陷阱”中(尝试.在已达到“ maxLength” attr 1时放置at索引)<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);">
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.