RegEx for Javascript字母数字不能按预期工作

时间:2014-12-09 21:37:59

标签: javascript jquery regex

我有以下脚本:

$('#txtUsername').keydown( function(evt) { 
   if (/^[a-z0-9]+$/i.test(String.fromCharCode(evt.keyCode)) == false)  {
      evt.returnValue = false; 
      return false;
   } 
});

上述脚本应该阻止用户在用户名字段中输入特殊字符。问题是这个脚本允许输入字母数字字符并阻止`~_ + - = [] {} \ |;:'",<。> /?

我需要这个也阻止和!@#$%^& *()字符。

我做错了什么?我正在使用最新的Chrome浏览器进行测试。

修改 我知道这不是验证用户名的最佳方法,但我质疑为什么正则表达式没有显示正确的行为。

jsFiddle点击here

2 个答案:

答案 0 :(得分:3)

使用keypress事件,而不是keydown。当您使用keydown时,输入 @ 会被视为按 Shift ,然后是 2 ,并允许2正则表达式。 keypress获取合并的密钥代码。

此外,不推荐使用evt.returnValue。阻止正常事件处理程序运行的正确方法是调用evt.preventDefault()



$('#txtUsername').keypress(function(evt) {
  if (/^[a-z0-9]+$/i.test(String.fromCharCode(evt.keyCode)) == false) {
    evt.preventDefault();
    return false;
  }
});

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="txtUsername" />
&#13;
&#13;
&#13;

答案 1 :(得分:2)

keydown只会记录按键盘上的实际,而不是输入的字符,例如在英国键盘%上输入了shift+5,因此keydown只会选取5键,因此接受输入。

您应该keypress代替:

$(document).ready(function () {
    $('#txtUsername').keypress(function (evt) {
        if (/^[a-z0-9]+$/i.test(String.fromCharCode(evt.keyCode)) == false) {
            evt.returnValue = false;
            return false;
        }
    });
});

Updated Fiddle