我正在编写一个javascript代码来限制可以输入文本框的密钥.
function keyRestricted(e) {
var keypressed;
var keychar;
var keycheck;
// IE - keyCode
// Netscape/Firefox/Opera - which
keypressed = e.keyCode || e.which;
keychar = String.fromCharCode(keypressed);
//alert(keychar);
keycheck = /[a-zA-Z0-9\b]/;
return keycheck.test(keychar);
} //keyrestricted
Run Code Online (Sandbox Code Playgroud)
我的正则表达式现在/[a-zA-Z0-9\b]/
,它允许字母数字和退格.我想允许删除,L/R箭头和转义键在Firefox(3.6)中工作.
我不确定这些键的符号是什么.
在ie8中,即使从正则表达式中排除\ e开关,转义键(和del /箭头)仍处于活动状态,按下时,它会重置/清空文本框.
在FF中,我将转义放在表达式中/[a-zA-Z0-9\b\e]/
,但它似乎对firefox不起作用,即当按下转义键时,它不会重置/清空文本框.
正则表达式的有效符号是什么,允许使用字母数字,L/R箭头,删除,转义?
另外,这个翻译是[a-zA-Z0-9\-\_]
什么?它的意思是字母数字和连字符.但是连字符前面的斜线是什么,因为连字符不需要斜线?什么是\_
for,因为下划线与表达式不匹配?
TIA
编辑
使用nnnnn建议的密钥代码的原因对我来说不适用(对于其他人?)是因为65-90的密钥代码是大写字母,即使有些网站确实声称这些密钥代码适用于大写和大写字母.
这个http://www.lookuptables.com/网站显示小写字母是97-122.不幸的是,这个范围与一些字符有一些未映射的重叠.例如,\字符被列为具有220个键码.但我的过滤器去激活密钥代码> 122仍然允许\通过.还有其他例子.
我使用笔记本电脑键盘和外接全尺寸键盘对此进行了测试.
编辑2
我将正则表达式和keycode参数合并到一个函数中.该函数原则上起作用,但由于疯狂的键码冲突,它不适用于%符号.它需要onkeydown和onkeypress来捕获所有键(%键除外).请参阅我在此讨论javascript正则表达式以获取关键事件输入验证疑难解答帮助
<head>
<script type="text/javascript">
function keyRestricted(evt) {
var theEvent = evt || window.event;
var key = theEvent.keyCode || theEvent.which;
var keychar = String.fromCharCode(key);
//alert(keychar);
var keycheck = /[a-zA-Z0-9]/;
// backspace || delete || escape || arrows
if (!(key == 8 || key == 27 || key == 46 || key == 37 || key == 39)) {
if (!keycheck.test(keychar)) {
theEvent.returnValue = false; //for IE
if (theEvent.preventDefault) theEvent.preventDefault(); //Firefox
}
}
}
</script>
</head>
<body>
Please modify the contents of the text field.
<input
type="text" value=""
onKeypress="return keyRestricted(event)"
onKeydown="return keyRestricted(event)"
/>
</body>
Run Code Online (Sandbox Code Playgroud)
nnn*_*nnn 10
据我所知,正则表达式 - 或者至少是JavaScript版本 - 不允许你测试一些"特殊"字符,如转义和箭头键(虽然我相信你可以测试退格).
我更喜欢用标准if
声明来实现这种事情:
var keypressed = e.which || e.keyCode;
if ((keypressed >=65 && keypressed <= 90) // letters
|| (keypressed >=48 && keypressed <= 57) // digits
|| keypressed === 8 // backspace
|| keypressed === 27 // escape
|| keypressed === 46 // delete
|| (keypressed >= 35 && keypressed <= 40) // end, home, arrows
// TODO: shift, ctrl, alt, caps-lock, etc
) {
// do something
}
// If the keys you care about don't follow any particular pattern
// a switch might be more convenient:
switch (keypressed) {
case 8:
case 27:
case 46:
// valid key, do something
break;
default:
// invalid key, do something else
break;
}
// You can also do something like this:
var permittedKeyCodes = {
"8" : true, // backspace
"27" : true, // escape
"46" : true // delete
};
if (permittedKeyCodes[keypressed]) {
// do something
}
Run Code Online (Sandbox Code Playgroud)
如果使用后一种方法,则在permittedKeyCodes
函数外定义对象会更有效.
有各种各样的地方(这里是一个),您可以在其中获得所有密钥代码的列表.
请注意,如果您正在捕获keydown或keyup事件,则返回的密钥代码与密钥相关联,而不是字符,因此例如,大写和小写A都具有相同的代码.按键事件的工作方式不同.