【问题标题】:How can I set max-length in an HTML5 "input type=number" element?如何在 HTML5“输入类型=数字”元素中设置最大长度?
【发布时间】:2012-01-11 09:39:40
【问题描述】:

对于<input type="number"> 元素,maxlength 不起作用。如何限制该数字元素的 maxlength

【问题讨论】:

  • max 属性在 Android 平板电脑的 chrome 浏览器中不起作用。

标签: html input numbers max


【解决方案1】:

您可以指定minmax 属性,这将只允许在特定范围内输入。

<!-- equivalent to maxlength=4 -->
<input type="number" min="-9999" max="9999">

不过,这只适用于微调器控制按钮。尽管用户可能能够键入大于允许的max 的数字,但表单不会提交。


从 Chrome 15 截取的屏幕截图

可以在 JavaScript 中使用 HTML5 oninput 事件来限制字符数:

myInput.oninput = function () {
    if (this.value.length > 4) {
        this.value = this.value.slice(0,4); 
    }
}

【讨论】:

  • 该 JavaScript 方法的一个可能问题是:如果插入点不在值的末尾,它可能无法按预期工作。例如,如果您在输入字段中输入值“1234”,然后将插入点移回该值的开头并键入“5”,则最终会得到值“5123”。这与最大长度为 4 的 input type="text" 字段不同,其中浏览器不允许您在“完整”字段中输入第 5 个字符,并且该值将保持为“1234”。
  • @Andy,显然问题是寻找一种非 JS 的方式来做maxlength......
  • @Pacerier:我的回答是否暗示了我的想法?如您所见,我提供了仅使用 HTML 即可实现的最接近的解决方案,以及使用 JavaScript 的附加建议,其中 OP 可能希望防止用户输入超出允许的字符数。
【解决方案2】:

要使用的更多相关属性是minmax

【讨论】:

    【解决方案3】:

    type="number" 一样,您指定max 而不是maxlength 属性,这是可能的最大数量。所以 4 位数字,max 应该是 9999,5 位数字 99999 等等。

    另外,如果你想确保它是一个正数,你可以设置min="0",确保为正数。

    【讨论】:

      【解决方案4】:

      您可以添加一个max 属性,该属性将指定您可以插入的最大可能数字

      <input type="number" max="999" />
      

      如果同时添加 maxmin 值,则可以指定允许值的范围:

      <input type="number" min="1" max="999" />
      

      以上内容仍然不会阻止用户手动输入超出指定范围的值。相反,他将看到一个弹出窗口,告诉他在提交表单时输入此范围内的值,如下图所示:

      【讨论】:

      • 克里斯特,这行得通。同样正如@Andy 所说,我已经使用 oninput 来分割额外的数字。参考mathiasbynens.be/notes/oninput
      • 这是正确的,但应该注意的是,安迪指出这并不限制人们输入更长的数字。所以它实际上并不等同于文本字段中的 maxlength。
      • DA : 当然可以,但你可以使用min="-999" max="999" 来伪造maxlength="3"
      • 如果你只是输入了一个更高精度的浮点数,这将会中断。例如。 3.1415926 解决了这个问题,因为它小于 999 且大于 1。
      • 我不知道为什么当它根本不起作用时,它会如此受欢迎和接受!它只影响“微调器”控件,不会阻止用户输入长数字。
      【解决方案5】:

      您可以像这样组合所有这些:

      <input name="myinput_drs"
      oninput="maxLengthCheck(this)"
      type = "number"
      maxlength = "3"
      min = "1"
      max = "999" />
      
      <script>
        // This is an old version, for a more recent version look at
        // https://jsfiddle.net/DRSDavidSoft/zb4ft1qq/2/
        function maxLengthCheck(object)
        {
          if (object.value.length > object.maxLength)
            object.value = object.value.slice(0, object.maxLength)
        }
      </script>
      


      更新:
      您可能还希望阻止输入任何非数字字符,因为object.length 将是数字输入的空字符串,因此其长度将为0。因此maxLengthCheck 函数将不起作用。

      解决办法:
      有关示例,请参阅 thisthis

      Demo - 在此处查看完整版代码:
      http://jsfiddle.net/DRSDavidSoft/zb4ft1qq/1/

      更新 2: 这是更新代码: https://jsfiddle.net/DRSDavidSoft/zb4ft1qq/2/

      更新 3: 请注意,允许输入多个小数点可能会导致数值混乱。

      【讨论】:

      • 这是一个很好的解决方案,但是我发现如果输入了任何非数字值,object.value.length 会返回 0。
      • @AndrewSpear 那是因为如果您在输入中输入非数字值并设置了“数字”类型,那么 object.value 将是一个空字符串。请参阅文档。另外,请阅读我的更新以解决此问题。
      • 如果您输入多个小数点,例如 111..1111,这仍然会中断。不要为了安全起见使用此代码,因为恶意代码仍有可能通过。
      • @PieBie Dude,这段代码是 3 年前的。改用 jQuery。
      • 是的,我知道,但初学者可能仍然只是复制粘贴。
      【解决方案6】:

      如果您正在寻找一种移动网络解决方案,希望您的用户在其中看到数字键盘而不是全文键盘。使用类型=“电话”。它将与 maxlength 一起使用,从而使您免于创建额外的 javascript。

      Max 和 Min 仍然允许用户输入超过 max 和 min 的数字,这不是最优的。

      【讨论】:

      • 我发现这不是数字输入的最佳解决方案,因为“tel”输入允许附加符号,并且在每个数字旁边显示字母。纯数字键盘看起来更干净。
      • @hawkharris 你是对的,type="number" 是更简洁的 UI。意外输入坏字符更容易。所以需要额外的验证来确保用户不会输入错误的数据。但也要考虑到用户也可以使用数字键盘轻松输入所有小数点。如果没有额外的 JavaScript,它也不能解决上面的问题。
      • 如果与 pattern="[0-9]*" 一起使用,额外的符号将被禁用
      • 但是tel类型会被辅助技术读取,让用户认为需要输入电话号码。这比使用默认文本类型更糟糕...
      • 这是对用户友好型数字输入模式的最佳总结之一:css-tricks.com/finger-friendly-numerical-inputs-with-inputmode 为了节省您的点击,这个 HTML 涵盖了很多领域,并支持很多浏览器:&lt;input type="number" inputMode="numeric" pattern="[0-9]*" min="1" max="2112"&gt; 然后如果需要,可以使用一些 JavaScript 来增强它?
      【解决方案7】:

      很简单,用一些javascript就可以模拟出maxlength,看看吧:

      //maxlength="2"
      <input type="number" onKeyDown="if(this.value.length==2) return false;" />
      

      【讨论】:

      • 使用您的解决方案,一旦达到 2 个字符,您就不能使用退格键。但我错过了一些功能性解决方案
      • 你应该使用 onKeyPress 而不是 onKeyDown。
      • 如果您突出显示文本并按一个字符(即替换输入内容)将不起作用
      • 如果这不是来自以下键stackoverflow.com/a/2353562/1534925,请验证这一点
      • keydown 的问题是您不能在最大字符处使用退格。 keypress 的问题是您可以复制+粘贴超过最大字符数。
      【解决方案8】:

      Maycow Moura 的回答是一个好的开始。 但是,他的解决方案意味着当您输入第二个数字时,该字段的所有编辑都会停止。所以你不能改变值或删除任何字符。

      以下代码在 2 处停止,但允许继续编辑;

      //MaxLength 2
      onKeyDown="if(this.value.length==2) this.value = this.value.slice(0, - 1);"
      

      【讨论】:

      • 不。尝试粘贴一个值。
      【解决方案9】:

      或者,如果您的最大值为 99 且最小值为 0,您可以将其添加到输入元素(您的值将被您的最大值等重写)

      <input type="number" min="0" max="99" 
         onKeyUp="if(this.value>99){this.value='99';}else if(this.value<0){this.value='0';}"
      id="yourid">
      

      然后(如果你愿意的话),你可以检查是否输入了真正的数字

      【讨论】:

      • ... 很好,但你不再需要 min 和 max 了,伙计。 (只是说)
      • @xoxel 如果您希望警告消息仍然显示,请执行此操作
      • 为了概括,我会做onKeyUp="if(this.value&gt;this.max)this.value=this.max;if(this.value&lt;this.min)this.value=this.min;"
      • 这是最好的回复,但我建议使用 onChange 而不是 keyUp,因为它在打字时过于激进。
      【解决方案10】:

      你也可以试试这个有长度限制的数字输入

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

      【讨论】:

        【解决方案11】:

        我之前遇到过这个问题,我用html5数字类型和jQuery的组合解决了。

        <input maxlength="2" min="0" max="59" name="minutes" value="0" type="number"/>
        

        脚本:

        $("input[name='minutes']").on('keyup keypress blur change', function(e) {
            //return false if not 0-9
            if (e.which != 8 && e.which != 0 && (e.which < 48 || e.which > 57)) {
               return false;
            }else{
                //limit length but allow backspace so that you can still delete the numbers.
                if( $(this).val().length >= parseInt($(this).attr('maxlength')) && (e.which != 8 && e.which != 0)){
                    return false;
                }
            }
        });
        

        我不知道这些事件是否有点矫枉过正,但它解决了我的问题。 JSfiddle

        【讨论】:

        • 您可以轻松粘贴字符。
        【解决方案12】:

        正如其他人所说,min/max 与 maxlength 不同,因为人们仍然可以输入一个大于您预期的最大字符串长度的浮点数。要真正模拟 maxlength 属性,您可以在紧要关头做这样的事情(这相当于 maxlength="16"):

        <input type="number" oninput="if(value.length>16)value=value.slice(0,16)">
        

        【讨论】:

        • slice 在插入中间时会在最终用户不知情的情况下删除字符。而 max-length 会阻塞。
        • @PradeepKumarPrabaharan maxlength 不受数字输入的支持。在我的示例中,value.slice(0,16) 不会启动,除非输入值超过 16 个字符。
        • 是的,数字输入不支持 maxlength .. 此代码是 gud 但此代码与 maxlength 的属性不完全匹配..
        • @TobiasGaertner type="number" 负责处理:)。
        • @10basetom ...取决于浏览器...例如在 FF 中,您仍然可以输入字符,并且它们不会在限制之后停止 - 但与类型编号的想法有关,这是一个可以接受的解决方案。
        【解决方案13】:

        我知道已经有了答案,但如果您希望输入的行为与 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();
        

        【讨论】:

        • @Phill_t 也许你能启发我?我使用了你的代码,它在原则上运行良好但“$(this).attr("maxlength")" 总是提供 2。为什么使用 "$(this).attr("maxlength")" 会更好如果它正在工作而不是我测试过的“this.maxlength”并且按预期工作并且更短并且恕我直言也更清晰易读?我错过了什么吗?
        • 你是什么意思“交付2”?
        • Phill_t 我很抱歉。 “this.maxLength”仅在 keydown 函数的范围内工作。在函数“addMax”中,“this”是文档而不是预期元素,因此具有不同的属性值。我将如何访问数字输入?上面的代码真的对你有用吗?我使用 Chrome/Opera/Vivaldi、Firefox、Edge、IE 和 Safari 进行了测试,每种浏览器的结果都相同。好的,在 Edge maxlegth="1" 和 maxlength="2" 中确实可以工作,但是 "$(this).attr("maxlength")" 不会因为更高的数字而进一步增加!!? @anybody:有什么建议吗?
        • 正如我所说的,它总是两个,因为它是在文档上调用的,而不是在我调试它时发现的有问题的元素上。顺便说一句,您可能还想看看我在研究您的解决方案后发现的解决方案:stackoverflow.com/a/41871960/1312012
        【解决方案14】:

        您可以将其指定为文本,但添加仅匹配数字的 pettern:

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

        它完美运行,并且在移动设备上(在 iOS 8 和 Android 上测试)弹出数字键盘。

        【讨论】:

        • IE9及更早版本不支持pattern属性,Safari部分支持:caniuse.com/#feat=input-pattern
        • 是的,感谢您的指点,但我们放弃了对 IE9 的支持(从它中剔除芥末),我更喜欢它而不是 JS 方法。取决于项目。
        • 不会阻止用户输入非数字字符。他们可以输入 2 个任意字符。 pattern 只会导致验证突出显示。
        • 在 Android 9 (Nokia 8) 上测试过,但我得到的是普通键盘 :( 有什么想法吗?
        【解决方案15】:

        最大长度不适用于&lt;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"
         />
        

        【讨论】:

          【解决方案16】:

          //For Angular I have attached following snippet.
          <div ng-app="">
            <form>
              Enter number: <input type="number" ng-model="number" onKeyPress="if(this.value.length==7) return false;" min="0">
            </form>
            <h1>You entered: {{number}}</h1>
          </div>

          如果您使用“onkeypress”事件,那么在开发时您将不会受到任何用户限制(对其进行单元测试)。如果您有要求不允许用户在特定限制后进入,请查看此代码并尝试一次。

          【讨论】:

          • 我在这里看到的问题是: 1. 如果输入达到 7 个数字,则替换为选择文本和类型不起作用 2. 当溢出“边界”命中时将输入增加 1 确实有效--> 9999999 并单击向上按钮。打破限制
          • 我尝试使用简单版本的 javascript。如果您愿意,可以使用 Run code sn-p 查看。因此,我没有发现任何限制。
          • 也没有发现任何限制。它停在 7 位数。我正在为我的代码使用这个解决方案。
          • 有一个限制。当您达到限制时,全选并想要替换它们不起作用。仅当我在返回 false 之前用 cur 覆盖值时,替换才对我有效。
          • @Insomnia88 ,@edub 如果我们编写函数并检查必要条件...
          【解决方案17】:

          我发现您不能使用任何onkeydownonkeypressonkeyup 事件来获得包括移动浏览器在内的完整解决方案。顺便说一句,onkeypress 已被弃用,并且不再出现在 chrome/opera for android 中(请参阅:UI Events W3C Working Draft, 04 August 2016)。

          我想出了一个仅使用oninput 事件的解决方案。 您可能需要根据需要进行额外的数字检查,例如负/正号或小数和千位分隔符等,但首先以下内容就足够了:

          function checkMaxLength(event) {
          	// Prepare to restore the previous value.
          	if (this.oldValue === undefined) {
          		this.oldValue = this.defaultValue;
          	}
          
          	if (this.value.length > this.maxLength) {
          		// Set back to the previous value.
          		this.value = oldVal;
          	}
          	else {
          		// Store the previous value.
          		this.oldValue = this.value;
          		
          		// Make additional checks for +/- or ./, etc.
          		// Also consider to combine 'maxlength'
          		// with 'min' and 'max' to prevent wrong submits.
          	}
          }

          我还建议将maxlengthminmax 结合使用,以防止多次错误提交。

          【讨论】:

            【解决方案18】:

            另一种选择是只为具有 maxlength 属性的任何内容添加一个侦听器,并将切片值添加到其中。假设用户不想在与输入相关的每个事件中使用函数。这是一个代码sn-p。忽略 CSS 和 HTML 代码,JavaScript 才是最重要的。

            // Reusable Function to Enforce MaxLength
            function enforce_maxlength(event) {
              var t = event.target;
              if (t.hasAttribute('maxlength')) {
                t.value = t.value.slice(0, t.getAttribute('maxlength'));
              }
            }
            
            // Global Listener for anything with an maxlength attribute.
            // I put the listener on the body, put it on whatever.
            document.body.addEventListener('input', enforce_maxlength);
            label { margin: 10px; font-size: 16px; display: block }
            input { margin: 0 10px 10px; padding: 5px; font-size: 24px; width: 100px }
            span { margin: 0 10px 10px; display: block; font-size: 12px; color: #666 }
            <label for="test_input">Text Input</label>
            <input id="test_input" type="text" maxlength="5"/>
            <span>set to 5 maxlength</span>
            
            <br>
            
            <label for="test_input">Number Input</label>
            <input id="test_input" type="number" min="0" max="99" maxlength="2"/>
            <span>set to 2 maxlength, min 0 and max 99</span>

            【讨论】:

              【解决方案19】:

              HTML 输入

               <input class="minutesInput" type="number" min="10" max="120" value="" />
              

              jQuery

               $(".minutesInput").on('keyup keypress blur change', function(e) {
              
                  if($(this).val() > 120){
                    $(this).val('120');
                    return false;
                  }
              
                });
              

              【讨论】:

                【解决方案20】:

                为数字输入设置最大长度的一种简单方法是:

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

                【讨论】:

                • 不适用于 android chrome。 onkeypress 对此有一些问题。
                【解决方案21】:

                呃。就像有人在实现它的过程中放弃了,并认为没有人会注意到。

                无论出于何种原因,上面的答案都没有使用minmax 属性。这个 jQuery 完成了它:

                    $('input[type="number"]').on('input change keyup paste', function () {
                      if (this.min) this.value = Math.max(parseInt(this.min), parseInt(this.value) || 0);
                      if (this.max) this.value = Math.min(parseInt(this.max), parseInt(this.value) || 0);
                    });
                

                如果你是那些“jQuery-is-the-devil”类型中的一种,它可能也可以作为一个命名函数“oninput”w/o jQuery。

                【讨论】:

                • 它没有正确回答问题,但投票赞成,因为它解决了我的问题 :)
                【解决方案22】:
                <input type="number" onchange="this.value=Math.max(Math.min(this.value, 100), -100);" />
                

                或者如果您不想输入任何内容

                <input type="number" onchange="this.value=this.value ? Math.max(Math.min(this.value,100),-100) : null" />
                

                【讨论】:

                  【解决方案23】:

                  假设您希望最大允许值为 1000 - 输入或使用微调器。

                  您可以使用以下方法限制微调器值: type="number" min="0" max="1000"

                  并使用 javascript 限制键盘输入的内容: onkeyup="if(parseInt(this.value)&gt;1000){ this.value =1000; return false; }"

                  <input type="number" min="0" max="1000" onkeyup="if(parseInt(this.value)>1000){ this.value =1000; return false; }">
                  

                  【讨论】:

                    【解决方案24】:

                    这可能对某人有所帮助。

                    使用一点 javascript,您可以搜索所有本地日期时间输入,搜索用户尝试输入的年份,超过未来 100 年:

                    $('input[type=datetime-local]').each(function( index ) {
                    
                        $(this).change(function() {
                          var today = new Date();
                          var date = new Date(this.value);
                          var yearFuture = new Date();
                          yearFuture.setFullYear(yearFuture.getFullYear()+100);
                    
                          if(date.getFullYear() > yearFuture.getFullYear()) {
                    
                            this.value = today.getFullYear() + this.value.slice(4);
                          }
                        })
                      });
                    

                    【讨论】:

                      【解决方案25】:

                      我对所有输入使用一个简单的解决方案(使用 jQuery):

                      $(document).on('input', ':input[type="number"][maxlength]', function () {
                          if (this.value.length > this.maxLength) {
                              this.value = this.value.slice(0, this.maxLength); 
                          }
                      });
                      

                      代码选择所有定义了 maxlength 的 input type="number" 元素。

                      【讨论】:

                        【解决方案26】:

                        可行的简单解决方案,

                        • 输入滚动事件

                        • 通过键盘复制粘贴

                        • 鼠标复制粘贴

                        • 输入类型等案例

                          <input id="maxLengthCheck" 
                                 name="maxLengthCheck" 
                                 type="number" 
                                 step="1" 
                                 min="0" 
                                 oninput="this.value = this.value > 5 ? 5 : Math.abs(this.value)" />
                          

                        查看 this.value > 5 的条件,只需将 5 更新为您的最大限制。

                        解释

                        • 如果我们的输入数字大于我们的限制更新输入值 this.value 与适当的数字 Math.abs(this.value)

                        • 否则,只需达到您的最大限制,即 5。

                        【讨论】:

                          【解决方案27】:

                          由于我希望验证并且只允许整数,因此我采用了现有答案之一并对其进行了改进

                          这个想法是从 1 到 12 进行验证,如果输入低于 1,则将其设置为 1,如果输入高于 12,则将其设置为 12。不允许使用十进制符号。

                          <input id="horaReserva" type="number" min="1" max="12" onkeypress="return isIntegerInput(event)" oninput="maxLengthCheck(this)">
                          
                          function maxLengthCheck(object) {
                              if (object.value.trim() == "") {
                          
                              }
                              else if (parseInt(object.value) > parseInt(object.max)) {
                                  object.value = object.max ;
                              }
                              else if (parseInt(object.value) < parseInt(object.min)) {
                                  object.value = object.min ;
                              }
                          }
                          
                          function isIntegerInput (evt) {
                              var theEvent = evt || window.event;
                              var key = theEvent.keyCode || theEvent.which;
                              key = String.fromCharCode (key);
                              var regex = /[0-9]/;
                              if ( !regex.test(key) ) {
                                  theEvent.returnValue = false;
                          
                                  if(theEvent.preventDefault) {
                                      theEvent.preventDefault();
                                  }
                              }
                          }
                          

                          【讨论】:

                            【解决方案28】:

                            如果有人在 React 中遇到这个问题,我发现的最简单的解决方案是使用 onChange 函数,如下所示:

                                const [amount, setAmount] = useState("");
                                
                               return(
                                <input onChange={(e) => {
                                setAmount(e.target.value);
                                if (e.target.value.length > 4) {
                                     setAmount(e.target.value.slice(0, 4));
                                }
                                }} value={amount}/>)
                            

                            所以这基本上做的是它获取输入的值,如果输入值长度大于 4,它会切掉它后面的所有数字,所以你只能得到前 4 个数字(当然你可以改变您可以通过更改代码中的所有 4 来键入数字)。我希望这对任何在这个问题上苦苦挣扎的人有所帮助。另外,如果您想了解 slice 方法 的作用,可以查看out here

                            【讨论】:

                              【解决方案29】:

                              这是使用maxlength 的最简单解决方案:

                              <form>
                                 <input class="form-control" id="code_pin" oninput="if (this.value.length > this.maxLength) this.value = this.value.slice(0, this.maxLength);" type="number" maxlength="4">
                              </form>
                              

                              【讨论】:

                                猜你喜欢
                                • 1970-01-01
                                • 2021-11-01
                                • 2017-10-19
                                • 2020-01-05
                                • 1970-01-01
                                • 1970-01-01
                                • 2022-01-17
                                • 2021-12-11
                                • 1970-01-01
                                相关资源
                                最近更新 更多