在Chrome中输入类型="数字"忽略maxlength

Pra*_*V P 183 html5 google-chrome

maxlength属性无法使用<input type="number">.这只发生在Chrome中.

<input type="number" class="test_css"  maxlength="4"  id="flight_number" name="number"/>
Run Code Online (Sandbox Code Playgroud)

And*_*ion 226

来自MDN的文档<input>

如果值类型属性是text,email,search,password,tel,或url,此属性指定字符(Unicode代码点),用户可以输入的最大数目; 对于其他控件类型,它将被忽略.

因此maxlength<input type="number">设计忽略了.

根据您的需求,您可以使用minmax属性作为INON在他/她的回答表明(注:这只会定义的约束范围,而不是值的实际字符长度,虽然-9999〜9999将覆盖所有0-4数字数字),或者您可以使用常规文本输入并使用新pattern属性对字段执行验证:

<input type="text" pattern="\d*" maxlength="4">
Run Code Online (Sandbox Code Playgroud)

  • 另请注意,`type ="number"`是HTML 5规范中的新类型.如果您正在测试的浏览器无法识别`type ="number"`它会将其视为`type ="text"`***尊重`maxlength`属性.这可以解释你所看到的行为. (10认同)
  • @fooquency,你不在这里,因为你实际上不能通过设置`max`属性将"键盘输入"的物理长度限制为`type = number`输入.此属性仅限制输入的微调器选择的数字. (8认同)
  • 使用`regex` 和模式是一个令人难以置信的创意。但是在移动设备中,与“Android”或“iOS”没有区别,它是“文本”输入,因此会导致“用户体验”不佳。 (8认同)
  • 什么是`\ d*`在这里? (3认同)
  • pattern =“ \ d *”在IE11或Firefox 56中不起作用。https://jsfiddle.net/yyvrz84v/ (3认同)
  • @PardeepJain `\d*` 是一个 [正则表达式](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp) 匹配 0 个或多个数字字符。 (2认同)
  • 模式的行为方式与数字输入的 max/min 相同,因为您可以输入违反模式的文本,但输入不会阻止文本。它只会阻止您提交输入值违反条件的字段 (2认同)
  • 但是,它允许字母字符。我该如何避免呢? (2认同)
  • @DmanCannon,“模式”仅强制验证。它不限制输入。 (2认同)

Neh*_*ain 181

最大长度将无法使用<input type="number"我知道的最佳方式使用oninput事件来限制maxlength.请参阅以下代码.

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

  • @Barleby.只是`oninput ="this.value = this.value.slice(0,this.maxLength)"`应该工作 (28认同)
  • 从技术上讲,“number”类型的“maxlength”属性在 HTML5 中是无效的,因此“.maxLength”属性可能会从 Javascript 中删除。我认为最好使用 `data` 属性: `&lt;input type="number" data-maxlength="6" oninput="this.value=this.value.slice(0,this.dataset.maxlength)" /&gt;` (4认同)
  • 这就像一个魅力,谢谢你! (2认同)
  • @WashingtonGuedes 上面的代码在`&lt;input type="number"&gt;` http://stackoverflow.com/questions/18510845/maxlength-ignored-for-input-type-number-in-chrome#comment68792329_34641129 上为我工作 (2认同)

Vik*_*ngh 31

许多人发布了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;" />
Run Code Online (Sandbox Code Playgroud)

  • 这是非常有用的,比这里的任何其他答案更短,更好,同时保持html5 _`number`_输入类型 (3认同)
  • 在输入4位数字后,我尝试过将文本框冻结,没有任何更新空间,删除键和退格键均无效,什么也不起作用,如何编辑任何数字,请提及。 (3认同)
  • 当您键入 9999 并按输入时的向上按钮时,不起作用。 (3认同)
  • 我能够输入你的代码片段(1.2.3.4.5.5.6.76.7) (2认同)

May*_*ura 26

我有两种方法可以做到这一点

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

<input type="tel" />
Run Code Online (Sandbox Code Playgroud)

第二:使用一点JavaScript:

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

  • 你的第二个答案不是很好:如果你达到2个字符,你就不能删除任何数字. (2认同)
  • 数组键和删除(转发)按钮也应该包括在内. (2认同)

ino*_*non 23

您可以使用minmax属性.

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

<input type="number" min="-999" max="9999"/>
Run Code Online (Sandbox Code Playgroud)

  • 如果你想增加长度限制,这不起作用,虽然你将无法超过数字"9999",用户可以手动输入超过该长度的数字. (62认同)
  • 这怎么能得到 37 票!!! (14认同)
  • 我会说这应该是正确答案.Chrome至少根据最小/最大参数调整盒子的大小. (2认同)

Pet*_*ter 15

如何限制输入类型最大长度

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


小智 8

我写了一个小而干净的解决方法。使用这个函数将使其正常工作,因为它应该

  const inputHandler = (e) => {
    const { value, maxLength } = e.target;
    if (String(value).length >= maxLength) {
      e.preventDefault();
      return;
    }
  };
Run Code Online (Sandbox Code Playgroud)

例如,它可以在 React 中这样使用:

<input
  type="number"
  maxlength="4"
  onKeyPress={inputHandler}
/>
Run Code Online (Sandbox Code Playgroud)


J_K*_*J_K 8

以下代码将允许用户:

  1. 仅输入 0-999 范围内的数字。
  2. 这也限制用户不能输入超过3个字符。
  3. 当用户输入超过 3 个字符时,它将清除文本框。
<input type="number" name="test_name" min="0" max="999" oninput="validity.valid||(value='');"> 
Run Code Online (Sandbox Code Playgroud)


Moh*_*roz 7

我曾经遇到过同样的问题,并且根据我的需求找到了这种解决方案。这可能会有所帮助。

<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;"
/>
Run Code Online (Sandbox Code Playgroud)

快乐编码:)


pic*_*ode 7

对于 React 用户,

只需用您的最大长度要求替换 10

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


ari*_*ris 7

尝试使用电话:

 maxlength="5" type="tel"
Run Code Online (Sandbox Code Playgroud)

  • 但输入 tel 仍然允许字母数字。类型 Number 要求仅接受数字 [0-9]。电话不能代替号码 (3认同)

Jon*_*ine 7

输入类型文本和 oninput 事件与正则表达式仅接受对我有用的数字。

<input type="text" maxlength="4" oninput="this.value=this.value.replace(/[^0-9]/g,'');" id="myId"/>
Run Code Online (Sandbox Code Playgroud)


pwn*_*all 6

Chrome(技术上是 Blink)不会<input type="number">.

HTML5 规范规定maxlength 仅适用于文本、url、电子邮件、搜索、电话和密码类型。


小智 6

这是我使用 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;
});
Run Code Online (Sandbox Code Playgroud)

并处理复制和粘贴:

$('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);
});
Run Code Online (Sandbox Code Playgroud)

我希望它对某人有帮助。


Sur*_*een 6

<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;">
Run Code Online (Sandbox Code Playgroud)

演示 - JSFIDDLE


Akb*_*ali 6

这段代码对我有用

<form method="post">
      <label for="myNumber">My Number:</label>
      <input type="number" maxlength="9" required
      oninput="javascript: if (this.value.length > this.maxLength) this.value = this.value.slice(0, this.maxLength);" >
     <br><br>
      <input type="submit" value="Submit">
</form>
Run Code Online (Sandbox Code Playgroud)


shi*_*obi 5

您也可以尝试使用具有长度限制的数字输入

<input type="tel" maxlength="4" />
Run Code Online (Sandbox Code Playgroud)

  • 在某些浏览器(特别是移动浏览器)中,`tel` 输入将被自动验证,在一些奇怪的情况下,前导 `0` 将更改为 `1`。 (9认同)

Mas*_*ood 5

将输入类型更改为文本,然后使用“ oninput”事件调用函数:

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

现在使用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, "");
}
Run Code Online (Sandbox Code Playgroud)

演示:https : //codepen.io/aslami/pen/GdPvRY


Cod*_*ker 5

尝试这个,

<input type="number" onkeypress="return this.value.length < 4;" oninput="if(this.value.length>=4) { this.value = this.value.slice(0,4); }" />
Run Code Online (Sandbox Code Playgroud)


use*_*321 5

如果您想在React 函数组件中执行此操作或不使用“this”,这里有一种方法。

<input onInput={handleOnInput}/>

const handleOnInput = (e) => {
  let maxNum = 4;
  if (e.target.value.length > maxNum) {
    e.target.value = e.target.value.slice(0, maxNum);
  }
};
Run Code Online (Sandbox Code Playgroud)