如何限制HTML5“数字”元素中的可能输入?

时间:2011-12-02 10:33:03

标签: html html5 input numbers max

对于<input type="number">元素,maxlength无效。如何限制该数字元素的maxlength

29 个答案:

答案 0 :(得分:291)

并且您可以添加max属性,该属性将指定您可以插入的最高编号

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

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

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

以上仍然阻止用户手动输入超出指定范围的值。相反,他将显示一个弹出窗口,告诉他在提交表单后输入此范围内的值,如此屏幕截图所示:

enter image description here

答案 1 :(得分:94)

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

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

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

Chrome's validation message for numbers greater than the max
取自Chrome 15的截图

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

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

答案 2 :(得分:76)

如果您正在寻找移动网络解决方案,您希望用户在其中查看数字键盘而不是全文键盘。使用type =“tel”。它将与maxlength一起使用,这将使您无法创建额外的JavaScript。

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

答案 3 :(得分:62)

你可以将所有这些结合起来:

<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

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

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

更新3: 请注意,允许输入超过一个小数点可能会弄乱数字值。

答案 4 :(得分:22)

非常简单,使用一些javascript可以模拟maxlength,请查看:

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

答案 5 :(得分:18)

或者,如果您的最大值是例如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">

然后(如果你想),你可以检查输入是否真的是数字

答案 6 :(得分:14)

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

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

它非常完美,而且在移动设备上(在iOS 8和Android上测试过)会弹出数字键盘。

答案 7 :(得分:10)

//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”事件,那么在开发过程中您将不会受到任何用户限制(单元测试)。如果您有要求不允许用户在特定限制后输入,请查看此代码并尝试一次。

答案 8 :(得分:7)

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

答案 9 :(得分:6)

另一种选择是只为具有maxlength属性的任何内容添加一个侦听器,并将切片值添加到该属性。假设用户不想在与输入相关的每个事件中使用函数。这是一段代码片段。忽略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>

答案 10 :(得分:6)

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

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

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

答案 11 :(得分:6)

正如其他人所说,min / max与maxlength不同,因为人们仍然可以输入一个大于你想要的最大字符串长度的浮点数。要真正模拟maxlength属性,您可以在压缩中执行类似的操作(这相当于maxlength =“16”):

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

答案 12 :(得分:5)

之前我遇到过这个问题,我使用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

答案 13 :(得分:4)

让我们说您希望最大允许值为1000(无论是键入的还是旋转的)。

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

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

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

答案 14 :(得分:3)

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

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

答案 15 :(得分:3)

type="number"一样,您指定max而不是maxlength属性,这是可能的最大数量。因此,对于4位数,max应为9999,5位为99999,依此类推。

此外,如果您想确保它是正数,您可以设置min="0",确保正数。

答案 16 :(得分:3)

为数字输入设置maxlength的简单方法是:

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

答案 17 :(得分:2)

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

  });

答案 18 :(得分:1)

如果有人在 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 来键入数字)。我希望这对任何在这个问题上苦苦挣扎的人有所帮助。此外,如果您想了解 切片方法 的作用,您可以查看它out here

答案 19 :(得分:1)

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

答案 20 :(得分:1)

唉。这就像有人放弃了实施它的一半,并且认为没有人会注意到。

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

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

如果您使用的是“jQuery-is-the-devil”类型之一,它可能也可以作为命令函数“oninput”使用jQuery。

答案 21 :(得分:1)

我发现,您无法使用任何public void callbackStringFromJni(String name, String typeS) { Log.e("","callbackStringFromJni name: " + name + ".. type: " + typeS); } onkeydownonkeypress事件来获得包含移动浏览器的完整解决方案。顺便说一句onkeyup已被弃用,并且不再出现在 chrome / opera for android中(参见:UI Events W3C Working Draft, 04 August 2016)。

我找到了仅使用onkeypress事件的解决方案。 您可能需要根据需要进行额外的数字检查,例如负/正号或小数和千位分隔符等,但作为开头,以下内容应该足够:

&#13;
&#13;
oninput
&#13;
&#13;
&#13;

我还建议将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. } }maxlengthmin合并,以防止错误提交,如上所述。

答案 22 :(得分: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();

答案 23 :(得分:0)

这可能会帮助某人。

使用少量JavaScript,您可以搜索所有datetime-local输入,搜索用户尝试输入的年份(未来大于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);
      }
    })
  });

答案 24 :(得分:0)

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

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

代码选择已定义maxlength的所有输入type =“ number”元素。

答案 25 :(得分:0)

可以使用的简单解决方案,

  • 输入滚动事件

  • 通过键盘复制粘贴

  • 通过鼠标复制粘贴

  • 输入类型等情况

    <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。

答案 26 :(得分:0)

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

想法是从 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();
        }
    }
}

答案 27 :(得分:0)

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

答案 28 :(得分:-1)

只需编写此内容...

<input type="text" onkeypress="return event.target.value.length < 13"  placeholder="Enter Identity card number" class="form-control">