检测可打印的键

时间:2010-11-16 12:36:48

标签: javascript keyboard

我需要检测刚刚按下的键是否是可打印的键,如字符,可能是重音符号,数字,空格,标点符号等,或者是不可打印的键,如ENTER,TAB或删除。

有没有一种可靠的方法在Javascript中执行此操作,除了列出所有不可打印的键并希望不要忘记一些?

3 个答案:

答案 0 :(得分:21)

幸运的是,在现代浏览器中,此任务更容易。您现在可以使用KeyboardEvent.key通过其长度检测可打印的密钥。



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

<input id="test">
&#13;
&#13;
&#13;

除此之外,您还可以检测列表中的任何其他键,例如EnterDeleteBackspaceTab等。

这种方法更加可靠,因为与event.which不同,event.key已经标准化了。

答案 1 :(得分:16)

我昨天回答了similar question。请注意,您必须使用keypress事件来处理任何与字符相关的事件; keydown不会这样做。

顺便说一下,我认为 Enter 是可打印的,而且这个函数认为它是。如果您不同意,可以修改它以过滤掉事件设置为13的whichkeyCode属性的按键。

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 :(得分:0)

如果您需要在用户更改输入时识别可打印的键以进行更改检测,您可以使用 oninput 事件。