代码之家  ›  专栏  ›  技术社区  ›  step

Html输入模式不适用于忽略斜杠[重复]

  •  0
  • step  · 技术社区  · 6 年前

    有没有快速设置HTML文本输入的方法( <input type=text />

    0 回复  |  直到 6 年前
        1
  •  10
  •   AleKennedy    7 年前

    注: 这是一个更新的答案。下面的评论指的是一个旧版本,它弄乱了按键代码。

    JavaScript

    on JSFiddle

    可以过滤文本的输入值 <input> 具有以下内容 setInputFilter all browsers since IE 9 ):

    // Restricts input for the given textbox to the given inputFilter function.
    function setInputFilter(textbox, inputFilter, errMsg) {
      ["input", "keydown", "keyup", "mousedown", "mouseup", "select", "contextmenu", "drop", "focusout"].forEach(function(event) {
        textbox.addEventListener(event, function(e) {
          if (inputFilter(this.value)) {
            // Accepted value
            if (["keydown","mousedown","focusout"].indexOf(e.type) >= 0){
              this.classList.remove("input-error");
              this.setCustomValidity("");
            }
            this.oldValue = this.value;
            this.oldSelectionStart = this.selectionStart;
            this.oldSelectionEnd = this.selectionEnd;
          } else if (this.hasOwnProperty("oldValue")) {
            // Rejected value - restore the previous one
            this.classList.add("input-error");
            this.setCustomValidity(errMsg);
            this.reportValidity();
            this.value = this.oldValue;
            this.setSelectionRange(this.oldSelectionStart, this.oldSelectionEnd);
          } else {
            // Rejected value - nothing to restore
            this.value = "";
          }
        });
      });
    }
    

    设置输入过滤器 安装输入滤波器的功能:

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

    .input-error{
      outline: 1px solid red;
    }
    

    JSFiddle demo 必须进行服务器端验证!

    打字脚本

    function setInputFilter(textbox: Element, inputFilter: (value: string) => boolean, errMsg: string): void {
        ["input", "keydown", "keyup", "mousedown", "mouseup", "select", "contextmenu", "drop", "focusout"].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

    this answer .

    HTML 5

    HTML 5有一个本机解决方案 <input type="number"> specification

    • 大多数浏览器只会在提交表单时验证输入,而不会在键入时验证输入。
    • Most mobile browsers 不支持 step , min max 属性。
    • Chrome(版本71.0.3578.98)仍然允许用户输入字符 e 和 E this question .
    • Firefox(版本64.0)和Edge(EdgeHTML版本17.17134)仍然允许用户输入

    你自己试试 on w3schools.com .

        2
  •  7
  •   Sicha    7 年前

    使用此DOM

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

    还有这个剧本

    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();
      }
    }
    
        3
  •  5
  •   mencargo    9 年前

    这里有一个简单的方法,只允许一个小数点,但不能超过:

    <input type="text" oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*?)\..*/g, '$1');" />

    没有

    <input type="text" oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*?)\..*/g, '$1').replace(/^0[^.]/, '0');" />

    这将允许 0.123 或 .123 0123 00.123 .

        4
  •  5
  •   Mehedi    5 年前

    <input type="number" 但除此之外,这两种方法是我能想到的最简洁的方法:

    <input type="text" 
               onkeyup="this.value=this.value.replace(/[^\d]/,'')">
    

    <input type="text" 
    onkeydown="return ( event.ctrlKey || event.altKey 
                        || (47<event.keyCode && event.keyCode<58 && event.shiftKey==false) 
                        || (95<event.keyCode && event.keyCode<106)
                        || (event.keyCode==8) || (event.keyCode==9) 
                        || (event.keyCode>34 && event.keyCode<40) 
                        || (event.keyCode==46) )">