按下键盘弹起事件(keyup)在按下键盘时弹出警告框(alert)时不会触发。

7
我有两个事件处理程序,一个用于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()...也许可以自己编写或使用某种对话框。 - ahren
在其他情况下也会发生这种情况,比如切换到超链接然后按回车键打开链接。当发生这种情况时,回车键的“keyup”事件不会被触发。 - Bob Lauer
1个回答

4
警报会阻止事件发生。相反,您可以手动触发此函数,因为它仍然会发生。
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键。 - Bob Lauer
@BobLauer 没错,但在警报的情况下,没有其他办法。 - Rene Pot
谢谢,我从来没有想到警报是问题的原因。 - Alexandra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接