在不在页面上放置输入元素的情况下捕获按键?

pow*_*boy 61 javascript

如何捕获按键,例如Ctrl + Z,而不在JavaScript中的页面上放置输入元素?似乎在IE中,keypress和keyup事件只能绑定到输入元素(输入框,textareas等)

Tim*_*own 61

对于不可打印的键,如箭头键和快捷键,如Ctrl-z,Ctrl-x,Ctrl-c,可能会在浏览器中触发某些操作(例如,在可编辑的文档或元素内),您可能无法获得按键所有浏览器中的事件.因此keydown,如果您对抑制浏览器的默认操作感兴趣,则必须使用.如果没有,keyup也会这样做.

keydown事件附加到document所有主流浏览器中:

document.onkeydown = function(evt) {
    evt = evt || window.event;
    if (evt.ctrlKey && evt.keyCode == 90) {
        alert("Ctrl-Z");
    }
};
Run Code Online (Sandbox Code Playgroud)

有关完整的参考,我强烈推荐Jan Wolter关于JavaScript密钥处理的文章.


Tra*_*ian 34

jQuery还有一个非常好的实现,非常容易使用.以下是跨浏览器实现此功能的方法:

$(document).keypress(function(e){
    var checkWebkitandIE=(e.which==26 ? 1 : 0);
    var checkMoz=(e.which==122 && e.ctrlKey ? 1 : 0);

    if (checkWebkitandIE || checkMoz) $("body").append("<p>ctrl+z detected!</p>");
});
Run Code Online (Sandbox Code Playgroud)

在IE7,Firefox 3.6.3和Chrome 4.1.249.1064中测试过

另一种方法是使用keydown事件并跟踪event.keyCode.但是,由于jQuery使用event.which规范化keyCode和charCode,因此他们的规范建议在各种情况下使用event.which:

$(document).keydown(function(e){
if (e.keyCode==90 && e.ctrlKey)
    $("body").append("<p>ctrl+z detected!</p>");
});
Run Code Online (Sandbox Code Playgroud)

  • 键码26是由按键事件设置的"哪个"的特定id(表示CTRL + z).要查看keypress事件的更多字符映射,请查看[jQuery docs](http://api.jquery.com/keypress/)或[unixpapa的关键事件测试器](http://unixpapa.com/js /testkey.html) (2认同)

Sal*_*Sal 13

检测按键,包括按键组合:

window.addEventListener('keydown', function (e) {
  if (e.ctrlKey && e.keyCode == 90) {
    // Ctrl + z pressed
  }
});
Run Code Online (Sandbox Code Playgroud)

这样做的好处是,您不会 覆盖任何全局属性,而只是引入副作用.不好,但绝对比这里的其他建议更加邪恶.


Gib*_*olt 11

对于现代JS,请使用event.key!

document.addEventListener("keypress", function onPress(event) {
    if (event.key === "z" && event.ctrlKey) {
        // Do something awesome
    }
});
Run Code Online (Sandbox Code Playgroud)

Mozilla文档

支持的浏览器

  • 可能值得添加*为什么*现在应该更改所有旧代码,“现代 JS”方法有什么优势,*特别是*当“旧”/传统/标准方法具有更广泛的浏览器支持时。 (2认同)

Ben*_*owe 8

代码&检测ctrl + z

document.onkeyup = function(e) {
  if(e.ctrlKey && e.keyCode == 90) {
    // ctrl+z pressed
  }
}
Run Code Online (Sandbox Code Playgroud)