我正在开发一个应用程序,当用户在特定文本框上按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);
});
答案 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();