按住CMD键时,不会触发任何其他键的键盘

时间:2014-12-09 13:25:35

标签: javascript jquery javascript-events keyevent

我正在开发一个应用程序,当用户在特定文本框上按CMD + LEFT时,我需要进行一些后处理。我需要在浏览器的默认功能之后执行此操作(即,在将插入符号放在当前物理行中的第一个位置之后)。

只要CMD键关闭,问题就是keyup 触发LEFT键(或任何键)。

我用CTRL和SHIFT键尝试了这个,发现keyup按预期触发了辅助键。因此,如果您执行CTRL + LEFT然后释放LEFT然后释放CTRL,则总共有4个事件,2个keydowns和2个keyup。但是对于CMD密钥,我们得到2个keydowns,但只有一个keyup事件(当我们最后发布它时,CMD密钥本身就是一个)。

我使用SHIFT键尝试了这一点,发现keyup按预期触发了辅助键。因此,如果您执行SHIFT + LEFT然后释放LEFT然后释放SHIFT,则总共获得4个事件,2个keydowns和2个keyup。但是对于CMD密钥,我们得到2个keydowns,但只有一个keyup事件(当我们最后发布它时,CMD密钥本身就是一个)。

它可能是什么?当CMD关闭时,有没有办法让LEFT键(或任何键)触发keyup

我尝试使用OSX 10.9.5上的最新Google Chrome。 Firefox上的行为也完全相同。所以这不是Chrome问题。

演示:http://jsfiddle.net/techfoobar/xu0o11nh/4/

本质:

$('#mytextbox')

    // this gets correctly triggered for the meta key as well as the secondary key
    // when you press CMD and LEFT in sequence, you get two lines in the console one for 
    // the CMD key and one for the LEFT key
    .keydown(function(_e) {
        console.log('Keydown: ' + _e.keyCode);
    })

    // however, if I release the LEFT key (while keeping the CMD key down)
    // this does NOT get triggered for the LEFT key
    .keyup(function(_e) {
        console.log('Keyup: ' + _e.keyCode);
    });

3 个答案:

答案 0 :(得分:2)

这是带有元键的known behavior,遗憾的是没有已知的解决方法。

对于您的情况,您可以考虑自己实施默认浏览器行为(how to do that),然后实施所需的自定义行为,并使用_e.preventDefault();完成它

答案 1 :(得分:1)

这几乎可以肯定与系统设置热键有关。显然,根据文档,这个丢失的键盘事件也是expected behaviour

当我执行 cmd space 时,我甚至无法获得空间的keydown事件,因为聚光灯窗口会出现。

在你提到 ctrl 键时:因为我有'空格'设置当我 ctrl left ctrl 我没有触发左或右keydown事件,但 ctrl up ctrl down 至少解雇他们的keydown事件。

我认为很难假设使用没有"默认"热键设置。

答案 2 :(得分:0)

不要以为你需要一个固定时间。

我已经更改了代码来检测2个keydowns。这可以进一步重构为更清晰的代码。

http://jsfiddle.net/7nd7hf16/1/

var cmdDown = false;
$('#foo')
.keydown(function(_e) {
    if(_e.keyCode == 91)
        cmdDown = true;

    if(cmdDown && _e.keyCode == 37)
        console.log('cmd + left'); 

    console.log('Keydown: ' + _e.keyCode);
})
.keyup(function(_e) {
    if(_e.keyCode == 91)
        cmdDown = false;

    console.log('Keyup: ' + _e.keyCode);
})
.focus();