我有一个库,可以动态创建编辑器(http://epiceditor.com),并自动设置关键快捷方式。可以在选项中配置快捷方式,这样我就无法使用e.altKey
,e.ctrlKey
等等。
由于某些原因,修改键在Mac / Ubuntu浏览器上没有被设置回false
有时。
在Windows上,它似乎每次都会发生。您可以通过单击JSBin中的渲染然后按alt + p来重现此。你应该看到“Yay”出现。现在,如果在Windows上再次按再次 p。你会看到Yay再次出现。 Mac和Ubuntu用户偶尔会看到同样的问题,但很难重现它。
另请注意,这只会在看似alt键的情况下发生。下面我在18(alt)旁边有16(班次)。如果你把它们换掉它就能按预期工作。
精简测试用例的代码是:
var modKey = false;
var modKeyCode = 18; //16
document.body.addEventListener('keydown', function (e) {
if (!modKey && modKeyCode == e.keyCode) {
modKey = true;
}
if (modKey && e.keyCode == 80) {
console.log('Yay!');
}
});
document.body.addEventListener('keyup', function (e) {
if (modKey && modKeyCode == e.keyCode) {
modKey = false;
}
});
答案 0 :(得分:0)
我目前无法访问我的Linux机器,因此无法测试您的代码。
因此,这里有更多建议:
Linux(根据我的经验)对于keyCodes和关键事件的顺序是很挑剔的。也许将keyup中的if(..)和keydown
结合起来if (!modKey && modKeyCode == e.keyCode) {
modKey = true;
} else if (modKey && modKeyCode == e.keyCode) {
modKey = false;
}
上述建议是假设您没有特定要求同时拥有'keydown'和'keyup'。
答案 1 :(得分:0)
我已经提出了一个修复方案,虽然是一种糟糕的修复方法,但仍然是修复方法。
我使用的修复方法是在任何键组合成功时重置修饰符var。即按下p
中的alt+p
一个,将modKey
重置为false,如下所示:
var modKey = false;
var modKeyCode = 18; //16
document.body.addEventListener('keydown', function (e) {
if (!modKey && modKeyCode == e.keyCode) {
modKey = true;
}
if (modKey && e.keyCode == 80) {
console.log('Yay!');
modKey = false; //THIS
}
});
document.body.addEventListener('keyup', function (e) {
if (modKey && modKeyCode == e.keyCode) {
modKey = false;
}
});
这个问题是你不能做背靠背的关键命令。大多数情况下,这是正常的,因为用户将执行“保存”或“预览”之类的键命令,输入更多,然后执行另一个键命令。但是,你不能让我们说:alt+p s
触发alt+p
然后alt+s
而不必放开alt
密钥。