当 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()