Ключевые коды JavaScript - PullRequest
2 голосов
/ 25 июня 2011

Я работаю с подпрограммой 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, чтобы понять, что он пытается сделать.

Ответы [ 2 ]

5 голосов
/ 25 июня 2011

С этим не согласны две вещи: во-первых, если вы анализируете, какой символ был напечатан, вам нужно использовать событие 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 голос
/ 25 июня 2011

Я тоже не JS, но ... я могу объяснить, как это должно работать;Однако я не знаю, почему вы получаете значения, которые вы используете для упомянутых вами ключей.

keychar = String.fromCharCode(key);

Это проверяет, является ли ключ печатным символом (буква, знак пунктуации и т. Д.).)

if ((key == null) || (key == 0) || (key == 8) ||
    (key == 9) || (key == 13) || (key == 27))
    // Control key

Вышеприведенная проверка проверяет, является ли ключ пустым ИЛИ (||) `0 или 8 (возврат), или 9 (табуляция) или 13 (0x0D, или ENTER) или 27 (0x1Bили ESCAPE) - это именно тот логический результат, который вы ожидаете: ЕСЛИ или или или ...

else if (((chars).indexOf(keychar) > -1))

Это проверяет, находится ли keychar встрока символов, переданная как параметр chars

...