0

我有一个动态创建编辑器的库(http://epiceditor.com),还自动设置快捷键。快捷方式可以在选项中配置,所以我不能使用e.altKey,e.ctrlKey等,只是提醒一下。

出于某种原因,修饰键false 有时不会在 Mac/Ubuntu 浏览器上重新设置。

在 Windows 上,它似乎每次都会发生。您可以通过单击 JSBin 中的渲染然后按alt+来重现这一点p。您应该会看到“Yay”出现。现在,如果在 Windows 上再按一次 p。您会看到“Yay 再次出现。Mac 和 Ubuntu 用户偶尔会看到同样的问题,但很难重现它。

另请注意,这只发生在alt它看起来的密钥上。下面我在 18 (alt) 旁边有 16 (shift)。如果您将它们换掉,它将按预期工作。

精简测试用例的代码是:

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

4

2 回答 2

0

我目前无法访问我的 Linux 机器,所以我无法测试您的代码。

因此,这里更多的是一个建议:

Linux(根据我的经验)在 keyCodes 和关键事件的顺序方面很挑剔。也许将 keyup 中的 if(..) 与 keydown 结合起来

if (!modKey && modKeyCode == e.keyCode) {
  modKey = true;
} else if (modKey && modKeyCode == e.keyCode) {
  modKey = false;
}

上述建议是在假设您没有特定要求同时具有“keydown”和“keyup”的情况下提出的。

于 2012-06-27T06:07:10.200 回答
0

我想出了一个修复方法,虽然是一种糟糕的修复方法,但仍然是一个修复方法。

我采用的修复方法是在任何组合键成功时重置修饰符 var。即一个pinalt+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+palt+salt

于 2012-06-27T14:51:23.243 回答