jQuery:如何过滤掉keypress事件中的非字符键?

twi*_*wig 37 javascript jquery keypress

我尝试搜索但不确定要查找的术语.

我使用jQuery,并想在一个文本框,使用按键事件,但阻止所有非打印字符(即Enter,ESC,箭头键backspace,tab,ctrl,insert,F1- F12,等)从触发事件.

有没有一种简单的方法来确定它是否可打印?

And*_*ass 28

<script>
    $("input").keypress(function (e) {
        if (e.which !== 0 &&
            !e.ctrlKey && !e.metaKey && !e.altKey) {
            alert(String.fromCharCode(e.which));
        }
    });
</script>
Run Code Online (Sandbox Code Playgroud)

似乎与jQuery 1.4.2,FF,IE,Chrome一起工作得很好.

要深入研究JS键盘事件处理的混乱,请参阅: JavaScript Madness:键盘事件


更新为根据Daniel的评论过滤ctrl,meta和alt组合键.

  • 为什么使用二进制OR?"e.keyCode | e.charCode"可能应该是"e.keyCode || e.charCode"? (2认同)

Dan*_*iel 27

此问题的选定答案尚未完成.它不处理与修改键(例如CTRL- A)一起按下字符键的情况.

例如,尝试输入CTRL- A使用带有以下代码的firefox.目前的答案将其视为一个角色:

HTML:

<input placeholder="Try typing CTRL-A in Firefox" style="width: 200px"/>
Run Code Online (Sandbox Code Playgroud)

JavaScript的:

$("input").keypress(function (e) {
    if (e.which !== 0) {
        alert(String.fromCharCode(e.which));
    }
});
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/4jx7v/

注意:如果使用某些浏览器(例如Chrome),则不会触发警报,因为它们不会针对非字符输入触发按键事件.

更好的解决方案可能是:

HTML:

<input placeholder="Try typing CTRL-A in Firefox" style="width: 200px"/>
Run Code Online (Sandbox Code Playgroud)

JavaScript的:

$("input").keypress(function (e) {
    if (e.which !== 0 &&
        !e.ctrlKey && !e.metaKey && !e.altKey
    ) {
        alert(String.fromCharCode(e.which));
    }
});
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/hY5f4/

在这种情况下,仅在A按下时才触发警报,而不是CTRL- A对于所有浏览器.