用于Javascript字母数字的RegEx无法按预期工作

RegEx for Javascript alphanumeric not working as expected

本文关键字:工作 RegEx Javascript 数字 用于      更新时间:2023-09-26

我有以下脚本:

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

上面的脚本应该防止用户在用户名字段中输入特殊字符。 问题是此脚本允许键入字母数字字符,并且它阻止了"~_+-=[]{}''|;:'",<.>/?

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

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

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

js小提琴点击这里

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

此外,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" />

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;
        }
    });
});

更新的小提琴