当 keydown 打开警报时,Keyup 未触发

Posted

技术标签:

【中文标题】当 keydown 打开警报时,Keyup 未触发【英文标题】:Keyup not firing when keydown opens an alert 【发布时间】:2012-11-15 14:34:45 【问题描述】:

我有两个事件处理程序,一个用于 keydown,一个用于 keyup。 keydown 事件处理程序会触发警报消息,但这会阻止 keyup 事件触发。

您可以在这里看到一个非常简单的示例:http://jsfiddle.net/boblauer/jaGwT/ 当 keydown 打开警报时,不会触发 keyup,但是当未打开警报时,会触发 keyup。这是来自 jsfiddle 的代码:

var i = 0;
window.addEventListener('keydown', function(e) 
    if (i++ % 2) alert('down');
    console.log('down');
);

window.addEventListener('keyup', function(e) 
    alert('up');
    console.log('up');
);

我有一个库,支持监听多个组合键(例如'd + f'),所以当一个键被按下时,我需要将它添加到当前按下的键的列表中,当一个键已发布,我需要将其从所述列表中删除。我遇到的问题是,如果我想在同时按下 d + f 时显示警报,我从“当前按下”列表中删除这些键的代码永远不会触发,因为我的 keyup 处理程序永远不会被调用.

我想不出解决这个问题的好方法。有什么想法吗?

【问题讨论】:

那是因为 alert() 会阻塞 - 您不应该真的围绕使用 alert() 来设计您的网站...也许可以自行滚动或使用某种对话框。 在其他情况下也会发生这种情况,例如在超链接上按 Tab 键,然后按 Enter 键打开链接。发生这种情况时,不会触发 enter 的 keyup 事件。 【参考方案1】:

警报阻止事件发生。您可以做的是手动触发此功能,因为它无论如何都会发生。

var keyupfunction = function(e)
    alert('up');
    console.log('up');


window.addEventListener('keyup', keyupfunction);

window.addEventListener('keydown', function(e) 
    if (i++ % 2) alert('down');
    console.log('down');
    keyupfunction(e);
);

但实际上,您不应该使用警报。它可以防止这些事件,但谁知道它还会破坏什么。改用自定义的东西。

【讨论】:

keyup 不一定跟随 keydown 事件。例如,我可以按住 ctrl,然后按另一个键而不松开 ctrl。 @BobLauer 完全正确,但在警报的情况下,别无他法 谢谢,我从没想到警报是问题所在。

以上是关于当 keydown 打开警报时,Keyup 未触发的主要内容,如果未能解决你的问题,请参考以下文章

JQuery——键盘事件.keydown().keyup()和.keypress()

KeyDown,KeyPress 和KeyUp

在 JS/jQuery 中触发 keypress/keydown/keyup 事件?

jQuery - 按回车键触发跳转

jquery键盘事件及keycode大全

jQuery中keyup和keydown的应用? [复制]