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

Обнаруживать ключи для печати

Мне нужно определить, нажал ли только что нажатый ключ, например, символ, возможно акцентированный, номер, пробел, символ пунктуации и т.д. или непечатаемый ключ, например, ENTER, TAB или УДАЛИТЬ.

Есть ли надежный способ сделать это в Javascript, кроме перечисления всех непечатаемых ключей и надеемся не забыть некоторых?

4b9b3361

Ответ 1

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

Я бы сказал, что Enter можно, кстати, печатать, и эта функция считает это. Если вы не согласны, вы можете изменить его, чтобы отфильтровать нажатия клавиш с атрибутами which или keyCode для события, установленного в 13.

function isCharacterKeyPress(evt) {
    if (typeof evt.which == "undefined") {
        // This is IE, which only fires keypress events for printable keys
        return true;
    } else if (typeof evt.which == "number" && evt.which > 0) {
        // In other browsers except old versions of WebKit, evt.which is
        // only greater than zero if the keypress is a printable key.
        // We need to filter out backspace and ctrl/alt/meta key combinations
        return !evt.ctrlKey && !evt.metaKey && !evt.altKey && evt.which != 8;
    }
    return false;
}

var input = document.getElementById("your_input_id");
input.onkeypress = function(evt) {
    evt = evt || window.event;

    if (isCharacterKeyPress(evt)) {
        // Do your stuff here
        alert("Character!");
    }
});

Ответ 2

К счастью, эта задача намного проще в современных браузерах. Теперь вы можете использовать KeyboardEvent.key для обнаружения ключа для печати по его длине.

test.onkeydown = e => {
  let isPrintableKey = e.key.length === 1;
  alert(`Key '${e.key}' is printable: ${isPrintableKey}`);
}
<input id="test">