HTML text input allow only numeric input

前端 未结 30 3513
孤街浪徒
孤街浪徒 2020-11-21 04:58

Is there a quick way to set an HTML text input () to only allow numeric keystrokes (plus \'.\')?

相关标签:
30条回答
  • 2020-11-21 05:21

    Use this DOM

    <input type='text' onkeypress='validate(event)' />
    

    And this script

    function validate(evt) {
      var theEvent = evt || window.event;
    
      // Handle paste
      if (theEvent.type === 'paste') {
          key = event.clipboardData.getData('text/plain');
      } else {
      // Handle key press
          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();
      }
    }
    
    0 讨论(0)
  • 2020-11-21 05:22

    just use type="number" now this attribute supporting in most of the browsers

    <input type="number" maxlength="3" ng-bind="first">
    
    0 讨论(0)
  • 2020-11-21 05:24

    HTML5 has <input type=number>, which sounds right for you. Currently, only Opera supports it natively, but there is a project that has a JavaScript implementation.

    0 讨论(0)
  • 2020-11-21 05:24

    This is an improved function:

    function validateNumber(evt) {
      var theEvent = evt || window.event;
      var key = theEvent.keyCode || theEvent.which;
      if ((key < 48 || key > 57) && !(key == 8 || key == 9 || key == 13 || key == 37 || key == 39 || key == 46) ){
        theEvent.returnValue = false;
        if (theEvent.preventDefault) theEvent.preventDefault();
      }
    }
    
    0 讨论(0)
  • 2020-11-21 05:25

    This is the extended version of geowa4's solution. Supports min and max attributes. If the number is out of range, the previous value will be shown.

    You can test it here.

    Usage: <input type=text class='number' maxlength=3 min=1 max=500>

    function number(e) {
    var theEvent = e || window.event;
    var key = theEvent.keyCode || theEvent.which;
    if(key!=13&&key!=9){//allow enter and tab
      key = String.fromCharCode( key );
      var regex = /[0-9]|\./;
      if( !regex.test(key)) {
        theEvent.returnValue = false;
        if(theEvent.preventDefault) theEvent.preventDefault();
        }   
      }
    }
    
    $(document).ready(function(){
        $("input[type=text]").filter(".number,.NUMBER").on({
            "focus":function(e){
             $(e.target).data('oldValue',$(e.target).val());
                },
            "keypress":function(e){
                    e.target.oldvalue = e.target.value;
                    number(e);
                },
            "change":function(e){
                var t = e.target;
                var min = $(t).attr("min");
                var max = $(t).attr("max");
                var val = parseInt($(t).val(),10);          
                if( val<min || max<val)
                    {
                        alert("Error!");
                        $(t).val($(t).data('oldValue'));
                    }
    
                }       
        });     
    });
    

    If the inputs are dynamic use this:

    $(document).ready(function(){
        $("body").on("focus","input[type=text].number,.NUMBER",function(e){
            $(e.target).data('oldValue',$(e.target).val());
        }); 
        $("body").on("keypress","input[type=text].number,.NUMBER",function(e){
            e.target.oldvalue = e.target.value;
            number(e);
        }); 
        $("body").on("change","input[type=text].number,.NUMBER",function(e){
            var t = e.target
            var min = $(t).attr("min");
            var max = $(t).attr("max");
            var val = parseInt($(t).val());         
            if( val<min || max<val)
                {
                    alert("Error!");
                    $(t).val($(t).data('oldValue'));
                }
        }); 
    });
    
    0 讨论(0)
  • 2020-11-21 05:26

    Use this DOM:

    <input type = "text" onkeydown = "validate(event)"/>
    

    And this script:

    validate = function(evt)
    {
        if ([8, 46, 37, 39, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 35, 36].indexOf(evt.keyCode || evt.which) == -1)
        {
            evt.returnValue = false;
            if(evt.preventDefault){evt.preventDefault();}
        }
    }
    

    ...OR this script, without indexOf, using two for's...

    validate = function(evt)
    {
        var CharValidate = new Array("08", "046", "039", "948", "235");
        var number_pressed = false;
        for (i = 0; i < 5; i++)
        {
            for (Ncount = 0; Ncount < parseInt(CharValidate[i].substring(0, 1)) + 1; Ncount++)
            {
                if ((evt.keyCode || evt.which) == parseInt(CharValidate[i].substring(1, CharValidate[i].lenght)) + Ncount)
                {
                    number_pressed = true;
                }
            }
        }
        if (number_pressed == false)
        {
            evt.returnValue = false;
            if(evt.preventDefault){evt.preventDefault();}
        }
    }
    

    I used the onkeydown attribute instead of onkeypress, because the onkeydown attribute is checked before onkeypress attribute. The problem would be in the Google Chrome browser.

    With the attribute "onkeypress", TAB would be uncontrollable with "preventDefault" on google chrome, however, with the attribute "onkeydown", TAB becomes controllable!

    ASCII Code for TAB => 9

    The first script have less code than the second, however, the array of ASCII characters must have all the keys.

    The second script is much bigger than the first, but the array does not need all keys. The first digit in each position of the array is the number of times each position will be read. For each reading, will be incremented 1 to the next one. For example:




    NCount = 0

    48 + NCount = 48

    NCount + +

    48 + NCount = 49

    NCount + +

    ...

    48 + NCount = 57




    In the case of numerical keys are only 10 (0 - 9), but if they were 1 million it would not make sense to create an array with all these keys.

    ASCII codes:

    • 8 ==> (Backspace);
    • 46 => (Delete);
    • 37 => (left arrow);
    • 39 => (right arrow);
    • 48 - 57 => (numbers);
    • 36 => (home);
    • 35 => (end);
    0 讨论(0)
提交回复
热议问题