【问题标题】:How do I prevent invalid characters from being entered into a form?如何防止在表单中输入无效字符?
【发布时间】:2013-03-31 08:09:55
【问题描述】:

例如,如果我有一个表单并且我不希望用户在其中输入数字并且我使用包含正则表达式的函数对其进行验证,我如何防止用户输入的无效字符(在此示例中,一个数字)如果它没有通过正则表达式测试,它会不会出现在文本表单中?

这是我尝试过的功能和我尝试过的选择列表(换句话说,这不是整个程序)。我尝试将 false 返回到 onkeypress 事件处理程序,但用户在文本框中输入的内容仍然通过。

function noNumbers(answer) {  //returns false and displays an alert if the answer contains numbers
     if (/[\d]+/.test(answer)) {    // if there are numbers
         window.alert("You can not enter numbers in this field");
         return false;
     }

}

<form action="get" enctype="application/x-www-form-urlencoded">
    <select id="questions" name="questions">
         <option value="no_numbers">What is the name of the city where you were born?</option>
         <option value="no_letters">What is your phone number?</option>
         <option value="no_numbers">What is the name of your favorite pet?</option>
         <option value="no_letters">What is your social security number?</option>
         <option value="no_numbers">What is your mother's maiden name?</option>  
    </select>
    <p><input type="text" name="answer" onkeypress="validateAnswer();" /></p>
</form>

【问题讨论】:

  • Err... 如您所说,通过在 keypress 事件处理程序中返回 false。你尝试了什么?我们想看看你尝试过的代码。
  • 为什么要这样做?只需在发送数据之前对其进行验证,输入限制的烦人用户只是,嗯,烦人。
  • 这是学校作业。这也是我第一次问这个问题时没有发布代码的原因。因为班上的人可以复制它并声称它是他们自己的。但是我想我必须在这里发布一些代码供人们查看问题所在。
  • 您不是在检查被按下的键,而是在将新字符添加到输入字段后检查答案。到那时阻止它为时已晚。
  • 如何检查被按下的键?据我了解,我需要做一些涉及 unicode 的事情。

标签: javascript forms validation onkeypress


【解决方案1】:

当您在相关字段中输入无效字符时,此验证非常适合即时去除无效字符。示例:

<form id="form1" name="form1" method="post">
  Email:
  <input type="text" name="email" id="email" onkeyup='res(this, emailaddr);' ; </form>

  <script>
    var phone = "()-+ 0123456789";
    var numb = "0123456789";
    var alpha = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ @-'.,";
    var alphanumb = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ @-.'1234567890!?,:;£$%&*()";
    var alphaname = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ,-.1234567890";
    var emailaddr = "0123456789@._abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

    function res(t, v) {
      var w = "";
      for (i = 0; i < t.value.length; i++) {
        x = t.value.charAt(i);
        if (v.indexOf(x, 0) != -1)
          w += x;
      }
      t.value = w;
    }
  </script>

然后您只需使用代码中定义的变量将 javascript 调用的第二个值更改为您希望在字段中输入的数据类型。

【讨论】:

    【解决方案2】:

    这就是你要找的功能

    function validateAnswer(src) {
        var questions = document.getElementById("questions");
        var rule = questions.options[questions.selectedIndex].value;
        if(rule=="no_numbers") src.value = src.value.replace(/\d/g, '');
        if(rule=="no_letters") src.value = src.value.replace(/\w/g, '');
    }
    

    只需将输入字段引用发送到函数并将其设置为 onkeyup 事件即可:

    <input type="text" name="answer" onkeyup="validateAnswer(this);" />
    

    您还应该挂钩选择框的onchange 事件以重置输入框的值。我建议你也考虑HTML5 pattern attribute。见

    【讨论】:

    • 我无法弄清楚如何返回 false 和 Unicode(这是教科书说明所说的),但我做了类似于您在此处描述的操作,并且有效。跨度>
    【解决方案3】:

    您从传递给处理程序的事件对象中获得被按下的键。

    input type="text" name="answer" onkeypress="validateAnswer(this, event);" />
    
    function validateAnswer(element, event) {
      if (event.charCode) {
        if (/\d/.test(String.fromCharCode(event.charCode))) {
          window.alert("You can not enter numbers in this field");
          return false;
        }
      }
    }
    

    搜索“onkeypress 事件”可以找到很多这样的例子。

    【讨论】:

      【解决方案4】:

      通过向您的 validateAnswer 函数添加一个额外的参数来简化您的生活,如下所示:
      &lt;input type="text" id="answer" name="answer" onkeyup="validateAnswer(this);" /&gt;

      然后你可以像这样定义你的validateAnswer

      function validateAnswer(elem){
          elem.value = elem.value.replace(/[^\d]/g, '');
      }
      

      这里是一个例子:http://jsbin.com/iwiduq/1/

      【讨论】:

      • 如果我只想替换所有&lt;&gt;{}[]+ 字符怎么办?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多