我有以下脚本:
$('#txtUsername').keydown( function(evt) {
if (/^[a-z0-9]+$/i.test(String.fromCharCode(evt.keyCode)) == false) {
evt.returnValue = false;
return false;
}
});
上述脚本应该阻止用户在用户名字段中输入特殊字符。问题是这个脚本允许输入字母数字字符并阻止`~_ + - = [] {} \ |;:'",<。> /?
我需要这个也阻止和!@#$%^& *()字符。
我做错了什么?我正在使用最新的Chrome浏览器进行测试。
修改 我知道这不是验证用户名的最佳方法,但我质疑为什么正则表达式没有显示正确的行为。
jsFiddle点击here
答案 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;
答案 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;
}
});
});