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

Javascript 在页面上不放置输入元素的情况下捕获按键?,javascript,Javascript,如何捕获按键,例如Ctrl+Z,而不在JavaScript页面上放置输入元素?似乎在IE中,按键和按键事件只能绑定到输入元素(输入框、文本区域等)编码并检测ctrl+z document.onkeyup = function(e) { if(e.ctrlKey && e.keyCode == 90) { // ctrl+z pressed } } jQuery还有一个非常好的实现,非常容易使用。以下是如何跨浏览器实现此功能: $(document).keypre

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

编码并检测ctrl+z

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

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>");
});
document.onkeydown = function(evt) {
    evt = evt || window.event;
    if (evt.ctrlKey && evt.keyCode == 90) {
        alert("Ctrl-Z");
    }
};
$(文档)。按键(功能(e){
var checkWebkitandIE=(e.which==26?1:0);
var checkMoz=(e.which==122&&e.ctrlKey?1:0);
if(checkWebkitandIE | | | checkMoz)$(“body”).append(ctrl+z检测到!

); });
在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>");
});
$(文档).keydown(函数(e){
如果(e.keyCode==90&&e.ctrlKey)
$(“body”).append(ctrl+z检测到!

); });
对于不可打印的键(如箭头键)和快捷键(如Ctrl-z、Ctrl-x、Ctrl-c),这些键可能会在浏览器中触发某些操作(例如,在可编辑文档或元素内部),您可能无法在所有浏览器中获得按键事件。因此,如果您想抑制浏览器的默认操作,则必须使用
向下键
。否则,
keyup
也可以

keydown
事件附加到
文档
可在所有主要浏览器中使用:

$(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>");
});
document.onkeydown = function(evt) {
    evt = evt || window.event;
    if (evt.ctrlKey && evt.keyCode == 90) {
        alert("Ctrl-Z");
    }
};

对于完整的参考,我强烈建议。

检测按键,包括组合键:

window.addEventListener('keydown', function (e) {
  if (e.ctrlKey && e.keyCode == 90) {
    // Ctrl + z pressed
  }
});
这里的好处是,您不会覆盖任何全局属性,而只是引入了副作用。不太好,但肯定比这里的其他建议要少很多。对于现代JS,使用
event.key
! 注意:旧属性(
.keyCode
.which
)已弃用


不知道e。它可以捕捉击键和鼠标点击!您能告诉我如何获取keycode26吗?keycode26是由按键事件设置的“which”(表示CTRL+z)的特定id。要查看按键事件的更多字符映射,请查看或Thx。我知道keycode的意思。我的意思是,17代表Ctrl,90代表Z,那么你是怎么得到26的?我只是在谷歌上搜索了一下,但找不到答案。用我在评论中的链接测试不同按键的代码。你不会在所有浏览器中都得到26个。事实上,你在WebKit中只得到26分。不在IE、Firefox或IE中。@Tim:因为当GUI元素不在焦点时按下这些按键组合时,执行操作将是非常规的,因此违反了最小意外的原则。@Tomalak:还有其他元素可能需要合理地处理键事件,例如
,尽管我同意任何这样的元素都应该在发出关键事件之前得到关注。使用
tabindex
属性将使元素在无法接收焦点时能够接收焦点。我建议使用Keypress javascript库:捕获键盘输入的另一个原因是如果您只在屏幕上显示条形码,并使用条形码扫描仪作为键盘输入。大多数应用程序都有没有输入焦点的键盘快捷键。常识。以CTRL-Z表示撤销为例。@hendrik:我不明白为什么不应该,但我目前无法测试它。也许值得补充一下为什么现在应该更改所有旧代码,“现代JS”方法有什么优势,特别是当“旧”/“传统/标准”方法具有更广泛的浏览器支持时。