2

我正在使用我没有编写的 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 的了解还不够,无法了解它想要做什么。

4

2 回答 2

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;
    }
};
于 2011-06-24T23:51:58.843 回答
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

于 2011-06-25T00:30:13.757 回答