我正在使用我没写过的JavaScript例程。它是从文本框的onkeydown
属性调用,以防止不必要的击键。
显然没有使用第一个参数。第二个参数是应该允许的字符列表。
function RestrictChars(evt, chars) {
var key;
var keychar;
if (window.event)
key = window.event.keyCode;
else if (e)
key = e.which;
else
return true;
keychar = String.fromCharCode(key);
if ((key == null) || (key == 0) || (key == 8) ||
(key == 9) || (key == 13) || (key == 27))
// Control key
return true;
else if (((chars).indexOf(keychar) > -1))
return true;
else
return false;
}
这似乎适用于字母数字字符。但是,.
和/
等字符会导致此函数返回false
,即使这些字符包含在chars
参数中也是如此。例如,如果按下.
键,则key
设置为190,keychar
设置为“3/4”字符。
任何人都可以看到这是如何工作的和/或为什么不工作?我对JavaScript的了解不足以了解它正在尝试做什么。
答案 0 :(得分:5)
有两件事是错的:第一,如果你正在分析键入的字符,你需要使用keypress
事件而不是keydown
因为这是唯一告诉你的事件关于输入的实际字符的任何可靠信息。有关此问题和一般JavaScript关键事件的更多详细信息,请参阅http://unixpapa.com/js/key.html。其次,引用了一个名为e
的变量,它不会(但应该)与evt
参数对应。
这是一个重写,假设你有一个名为textBox
的变量引用文本输入元素。
jsFiddle:http://jsfiddle.net/9DZwL/
代码:
function isKeypressCharValid(e, chars) {
e = e || window.event;
// Allow delete, tab, enter and escape keys through
if (/^(8|9|13|27)$/.test("" + e.keyCode)) {
return true;
}
var charCode = (typeof e.which == "number") ? e.which : e.keyCode;
var charTyped = String.fromCharCode(charCode);
return chars.indexOf(charTyped) > -1;
}
textBox.onkeypress = function(evt) {
if (!isKeypressCharValid(evt, "abc123")) {
return false;
}
};
答案 1 :(得分:1)
我也不是JS人,但是......我可以解释它应该如何运作;我不知道为什么你得到你提到的钥匙的价值。
keychar = String.fromCharCode(key);
检查密钥是否为可打印字符(字母,标点符号等)
if ((key == null) || (key == 0) || (key == 8) ||
(key == 9) || (key == 13) || (key == 27))
// Control key
以上检查键是否为空OR(||
)`0或8(退格)或9(制表符)或13(0x0D,或ENTER)或27(0x1B或ESCAPE) - 它是正是您期望的布尔结果:IF< thiscondition>或者< thatcondition>或者< anothercondition>或者......
else if (((chars).indexOf(keychar) > -1))
这会检查keychar
是否在作为chars
参数传递的字符串中