HTML text input allow only numeric input

前端 未结 30 3410
孤街浪徒
孤街浪徒 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:31

    The best way (allow ALL type of numbers - real negative, real positive, iinteger negative, integer positive) is:

    $(input).keypress(function (evt){
        var theEvent = evt || window.event;
        var key = theEvent.keyCode || theEvent.which;
        key = String.fromCharCode( key );
        var regex = /[-\d\.]/; // dowolna liczba (+- ,.) :)
        var objRegex = /^-?\d*[\.]?\d*$/;
        var val = $(evt.target).val();
        if(!regex.test(key) || !objRegex.test(val+key) || 
                !theEvent.keyCode == 46 || !theEvent.keyCode == 8) {
            theEvent.returnValue = false;
            if(theEvent.preventDefault) theEvent.preventDefault();
        };
    }); 
    
    0 讨论(0)
  • 2020-11-21 05:32

    Note: This is an updated answer. Comments below refer to an old version which messed around with keycodes.

    JavaScript

    Try it yourself on JSFiddle.

    You can filter the input values of a text <input> with the following setInputFilter function (supports Copy+Paste, Drag+Drop, keyboard shortcuts, context menu operations, non-typeable keys, the caret position, different keyboard layouts, and all browsers since IE 9):

    // Restricts input for the given textbox to the given inputFilter function.
    function setInputFilter(textbox, inputFilter) {
      ["input", "keydown", "keyup", "mousedown", "mouseup", "select", "contextmenu", "drop"].forEach(function(event) {
        textbox.addEventListener(event, function() {
          if (inputFilter(this.value)) {
            this.oldValue = this.value;
            this.oldSelectionStart = this.selectionStart;
            this.oldSelectionEnd = this.selectionEnd;
          } else if (this.hasOwnProperty("oldValue")) {
            this.value = this.oldValue;
            this.setSelectionRange(this.oldSelectionStart, this.oldSelectionEnd);
          } else {
            this.value = "";
          }
        });
      });
    }
    

    You can now use the setInputFilter function to install an input filter:

    setInputFilter(document.getElementById("myTextBox"), function(value) {
      return /^\d*\.?\d*$/.test(value); // Allow digits and '.' only, using a RegExp
    });
    

    See the JSFiddle demo for more input filter examples. Also note that you still must do server side validation!

    TypeScript

    Here is a TypeScript version of this.

    function setInputFilter(textbox: Element, inputFilter: (value: string) => boolean): void {
        ["input", "keydown", "keyup", "mousedown", "mouseup", "select", "contextmenu", "drop"].forEach(function(event) {
            textbox.addEventListener(event, function(this: (HTMLInputElement | HTMLTextAreaElement) & {oldValue: string; oldSelectionStart: number | null, oldSelectionEnd: number | null}) {
                if (inputFilter(this.value)) {
                    this.oldValue = this.value;
                    this.oldSelectionStart = this.selectionStart;
                    this.oldSelectionEnd = this.selectionEnd;
                } else if (Object.prototype.hasOwnProperty.call(this, 'oldValue')) {
                    this.value = this.oldValue;
                    if (this.oldSelectionStart !== null &&
                        this.oldSelectionEnd !== null) {
                        this.setSelectionRange(this.oldSelectionStart, this.oldSelectionEnd);
                    }
                } else {
                    this.value = "";
                }
            });
        });
    }
    

    jQuery

    There is also a jQuery version of this. See this answer.

    HTML 5

    HTML 5 has a native solution with <input type="number"> (see the specification), but note that browser support varies:

    • Most browsers will only validate the input when submitting the form, and not when typing.
    • Most mobile browsers don't support the step, min and max attributes.
    • Chrome (version 71.0.3578.98) still allows the user to enter the characters e and E into the field. Also see this question.
    • Firefox (version 64.0) and Edge (EdgeHTML version 17.17134) still allow the user to enter any text into the field.

    Try it yourself on w3schools.com.

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

    So simple....

    // In a JavaScript function (can use HTML or PHP).

    function isNumberKey(evt){
        var charCode = (evt.which) ? evt.which : evt.keyCode;
        if (charCode > 31 && (charCode < 48 || charCode > 57))
            return false;
        return true;
    }
    

    In your form input:

    <input type=text name=form_number size=20 maxlength=12 onkeypress='return isNumberKey(event)'>
    

    With input max. (These above allows for a 12-digit number)

    0 讨论(0)
  • 2020-11-21 05:32
    <input name="amount" type="text" value="Only number in here"/> 
    
    <script>
        $('input[name=amount]').keyup(function(){
            $(this).val($(this).val().replace(/[^\d]/,''));
        });
    </script>
    
    0 讨论(0)
  • 2020-11-21 05:33

    If you want to suggest to the device (maybe a mobile phone) between alpha or numeric you can use <input type="number">.

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

    Just an other variant with jQuery using

    $(".numeric").keypress(function() {
        return (/\d/.test(String.fromCharCode(event.which) ))
    });
    
    0 讨论(0)
提交回复
热议问题