【问题标题】:Stuck alt / modifier key with Javascript用 Javascript 卡住 alt / 修饰键
【发布时间】:2012-06-27 05:17:41
【问题描述】:

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

由于某种原因,在 Mac/Ubuntu 浏览器上,修饰键未设置回 false有时

在 Windows 上似乎每次都会发生。您可以通过单击 JSBin 中的渲染然后按 alt+p 来重现此情况。您应该会看到“Yay”出现。现在,如果在 Windows 上按 just 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

【问题讨论】:

    标签: javascript dom-events keyboard-shortcuts


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 同样的问题:jsbin.com/uhupah/4/edit——如果我将所有代码移动到一个按键。与 Linux 或 OS X 相比,Windows 的问题更多,因为这些问题发生的频率较低。
    • @OscarGodson 哇!无法始终如一地重现错误确实很难解决。希望您的修复足以满足您的需求。
    【解决方案2】:

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

    我采用的修复方法是在任何组合键成功时重置修饰符 var。 IE。按下alt+p 中的pmodKey 重置为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 键。

    【讨论】:

      猜你喜欢
      • 2012-08-25
      • 1970-01-01
      • 1970-01-01
      • 2018-06-30
      • 2012-04-21
      • 2012-05-26
      • 1970-01-01
      • 2014-09-22
      • 2016-07-15
      相关资源
      最近更新 更多