【问题标题】:Text input numerical validation文本输入数值验证
【发布时间】:2016-01-26 05:09:07
【问题描述】:

我正在尝试让文本字段只允许数字。 (即“0-9”不是小数。)我遇到了this popular answer,它说:

<input type="text" onkeypress='return event.charCode >= 48 && event.charCode <= 57'></input>

我试过了,但问题是,它允许您粘贴任何字符。如何禁止粘贴“非法”字符?此外,此代码是否适用于不同的键盘,例如德语键盘?

请不要发布有关type="number" 的信息。由于很多原因,我没有使用它。

【问题讨论】:

    标签: javascript validation input


    【解决方案1】:

    您可以专门intercept the paste event 并在那里处理您的案件。

    【讨论】:

      【解决方案2】:

      HTML 代码:

      <form name="myForm" action="" onsubmit="return checkInp()" method="post">
        First name: <input type="text" name="age">
       <input type="submit" value="Submit">
      

      Javascript 代码:

      function checkInp()
         {
           var x=document.forms["myForm"]["age"].value;
             if (isNaN(x)) 
                {
                  alert("Must input numbers");
                  return false;
                }
         }
      

      【讨论】:

        【解决方案3】:

        对于用户友好的界面,通常最好根据输入的实际值进行验证,所以不要使用 charCode,使用输入的值。为此,一个简单的正则表达式适合:

        if (/\D/.test(value)) {
          // a non–digit was entered
        }
        

        通常最好在用户完成输入时进行验证,例如对于银行业务,我可能会将信用卡余额复制并粘贴为“1,203.43”,然后删除逗号。然后,当我使用合适的屏幕消息离开(onblur 或 onsubmit)该字段时,验证该字段,如果错误则让我修复它。

        但在某些情况下,它也适合使用 keyup 或其他一些合适的事件。

        因此,对于应该只有数字的输入,您可能会执行以下操作:

        function validate(el) {
          if (el.classList.contains('numsOnly')) {
            document.getElementById(el.id + 'Err').innerHTML = /\D/.test(el.value)? "Must contain only digits" : '';
          }
        }
        .screenHint {font: sans-serif; font-size: 80%; color: #999999}
        <label for="aNum">A number:<input name="aNum" id="aNum" class="numsOnly"
               onblur="validate(this)" onkeyup="validate(this)" onpaste="validate(this)"
               placeholder="1234"></label><span class="screenHint">Digits only</span><br>
        <span style="color:red; background-color: white;" id="aNumErr"></span>

        当然,您可能会动态添加侦听器并进行更广泛的验证,但上面显示了一些原则。

        【讨论】:

        • 感谢您的回答!我正在为颜色滑块执行此操作,以便用户可以输入值。我从未在屏幕上看到滑块输入的消息。你有什么建议?
        • @Jessica——没有看到你的界面很难说,但你可能只需要指出值范围,例如(0-9) 表示整数或 (0.0-9.9) 表示小数。
        【解决方案4】:

        您可以使用 keypress 事件,该事件将在每次输入新字符时检查输入。

        var txt = document.getElementById("phone");
        txt.onkeypress = function(key) {
          if (key.charCode < 48 || key.charCode > 57) return false;
        }
        txt.addEventListener("paste",
          function(e) {
            e.preventDefault();
            var pastedData = e.clipboardData.getData('Text');
            if (!isNaN(pastedData)) {
              txt.value += pastedData;
            }
          }, true);
        <fieldset>
          <label for="phone">Phone:</label>
          <input type="text" id="phone" />
        </fieldset>

        【讨论】:

        • 我喜欢这个,但有两点我不喜欢它。 1 - 它允许您添加一个“非法”字符,然后将其删除。 2 - 如果那里有数字,则粘贴“非法”字符,输入中的所有内容都会被删除。
        • @Jessica 我已经编辑了答案。它在 javascript 中,可以按您的意愿工作。请看一看。
        • 谢谢!为什么useCapture 设置为真?一定要这样吗?
        • 另外,所有浏览器都支持e.clipboardData.getData('Text')吗?
        • 这将回答您的问题:stackoverflow.com/questions/2176861/…
        【解决方案5】:

        拦截oninput 事件并在那里处理粘贴的文本。请注意,此事件也会在按键输入时触发。

        <script>
        function validate(element) {
          if (element.value.match('\\D')) {
            alert('Please enter only numeric values\n(You entered ' + element.value + ')');
            element.value = '';
          }
        }
        </script>
        
        <input type="text" oninput="validate(this);">
        

        【讨论】:

        • 感谢您的回答!如何删除 onpaste 事件中的“非法”字符?
        • 查看我编辑的答案。在实际粘贴文本之前,我没有意识到 onpaste 被触发,因此您无法(轻松)获取正在粘贴的文本的句柄。 oninput 在您的情况下可能是更好的选择。
        猜你喜欢
        • 2015-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-09
        • 2015-03-19
        • 2012-03-01
        • 1970-01-01
        相关资源
        最近更新 更多