用javascript粘住alt / modifier键

时间:2012-06-27 05:17:41

标签: javascript javascript-events keyboard-shortcuts

我有一个库,可以动态创建编辑器(http://epiceditor.com),并自动设置关键快捷方式。可以在选项中配置快捷方式,这样我就无法使用e.altKeye.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;
  }
});

演示:http://jsbin.com/uhupah/3/edit#javascript,html

2 个答案:

答案 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密钥。