我正在编写一个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
我的正则表达式现在是/[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\-\_]
的翻译是什么?
它的意思是字母数字和连字符。但是连字符前面的斜线是什么,因为连字符不需要斜线?什么是\_
,因为下划线与表达式不匹配?
TIA
修改
使用nnnnn建议的密钥代码的原因对我来说不适用(对于其他人?)是因为65-90的密钥代码是大写字母,即使有些网站声称这些密钥代码都适用于较低的字母代码和大写。
此http://www.lookuptables.com/网站显示小写字母为97-122。不幸的是,这个范围与一些字符有一些未映射的重叠。例如,\字符被列为具有220个键码。但我的过滤器停用了密钥代码> 122仍然允许\通过。还有其他例子。
我使用笔记本电脑键盘和外接全尺寸键盘对此进行了测试。
编辑2
我将正则表达式和keycode参数合并到一个函数中。该函数原则上起作用,但由于疯狂的键码冲突,它不适用于%符号。它需要onkeydown和onkeypress来捕获所有键(%键除外)。请参阅我的讨论here javascript regex for key event input validations troubleshooting help
<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>
答案 0 :(得分:10)
据我所知,正则表达式 - 或者至少是JavaScript版本 - 不允许你测试某些“特殊”字符,比如转义和箭头键(虽然我相信你可以测试退格)。 / p>
我更喜欢使用标准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
}
如果使用后一种方法,在函数外定义permittedKeyCodes
对象会更有效。
有各种地方(here's one),您可以在其中获取所有密钥代码的列表。
请注意,如果您正在捕获keydown或keyup事件,则返回的密钥代码与密钥相关联,而不是字符,因此例如,大写和小写A都具有相同的代码。按键事件的工作方式不同。
答案 1 :(得分:2)
阅读http://unixpapa.com/js/key.html。它将告诉您解决此问题所需的一切。
摘要:
keydown
(非keypress
)事件来检测不可打印的键,例如箭头键keyCode
属性将适用于所有浏览器,因此不需要which
属性。keyCode
与keydown
和keyup
中输入的字符无关,因此请勿尝试从该事件中获取字符。keypress
事件中禁止默认浏览器行为(不是keydown
),因此要支持Opera,您还需要处理keypress
事件,并在keydown
事件中设置一个标志,供keypress
处理程序检查。