Подтвердить что ты не робот

Определить, является ли JavaScript e.keyCode печатным (неконтролируемым) символом

Я просто хотел бы узнать диапазон (-ы) JavaScript keyCode, который соответствует печатаемым символам; или, альтернативно, диапазон непечатаемых (управляющих) символов, таких как backspace, escape, command, shift и т.д., поэтому я могу их игнорировать.

Причина, по которой я спрашиваю: вызов String.fromCharCode() приводит к нечетным символам для ключей управления. Например, я получаю "[" для левой команды, "%" для стрелки влево. Такая странность.

4b9b3361

Ответ 1

Keydown даст вам keyCode нажатой клавиши без каких-либо изменений.

$("#keypresser").keydown(function(e){
    var keycode = e.keyCode;

    var valid = 
        (keycode > 47 && keycode < 58)   || // number keys
        keycode == 32 || keycode == 13   || // spacebar & return key(s) (if you want to allow carriage returns)
        (keycode > 64 && keycode < 91)   || // letter keys
        (keycode > 95 && keycode < 112)  || // numpad keys
        (keycode > 185 && keycode < 193) || // ;=,-./` (in order)
        (keycode > 218 && keycode < 223);   // [\]' (in order)

    return valid;
});

Только числовые клавиши, буквенные клавиши и пробел будут иметь коды клавиш, соответствующие String.fromCharCode, поскольку используются значения Unicode.

Keypress - это представление введенного текста charCode. Обратите внимание, что это событие не будет срабатывать, если текст не будет "распечатан" в результате нажатия клавиши.

$("#keypresser").keypress(function(e){
    var charcode = e.charCode;
    var char = String.fromCharCode(charcode);
    console.log(char);
});

http://jsfiddle.net/LZs2D/1/ Покажет, как они работают.

KeyUp ведет себя аналогично KeyDown.

Ответ 2

Как раз для фона, событие "keypress" даст вам свойство charCode всякий раз, когда вы нажимаете клавишу символа.

Editor.addEventListener('keypress', function(event){
    if (event.charCode) {
        //// character key
        console.log( String.fromCharCode(event.charCode) ); /// convert charCode to intended character.
    } else {
        //// control key
    }

Однако событие "keypress" не захватывает каждое нажатие клавиши - несколько клавиш загораются перед событием "keypress".

Напротив, событие "keydown" будет захватывать каждое нажатие клавиши, но у него нет свойства charCode. Итак, как мы можем определить, является ли это символьным ключом? Проверка каждого нажатия клавиши, если ключевой код находится в пределах нижней и верхней границ для нескольких диапазонов, не является оптимально эффективной. Я подозреваю, что есть также проблемы для символов вне диапазона ASCII.

Мой подход - проверка длины свойства "ключ" события. Свойство "ключ" является альтернативой "keyCode" для определения того, какой ключ был нажат. Для ключей управления свойство "ключ" является описательным (например, "rightArrow", "F12", "return" и т.д.). Для символьных клавиш свойство "ключ" для символьного ключа - это только символ (например, "a", "A", "~", "\" и т.д.). Следовательно, для каждого символьного ключа длина свойства "ключ" будет иметь длину 1; тогда как управляющие символы будут иметь длину больше 1.

Editor.addEventListener('keydown', function(event){
    if (event.key.length == 1){ 
        //// character key
    } else {
        //// control key
    }
})

Ответ 4

Вы также можете использовать RegEx для этого:

$(".input").keyup(function (event) {
    if (event.key.match(/^[\d\w]$/i)) {
      // put function to trigger when a digit or a word character is pressed here
    }

флаг i делает выражение нечувствительным к регистру.