【问题标题】:jQuery not detecting modifiers on keyupjQuery 没有检测到 keyup 上的修饰符
【发布时间】:2014-11-23 04:23:50
【问题描述】:

当我在 Mac 上运行以下代码并按下命令键(使用 Chrome)时,metaKey 设置为 keydown,但未设置为 keyup。难道我做错了什么?我只是想跟踪被按下的元键,以便我可以在我的 JavaScript 中使用它 - 如果有更好的方法,请告诉我:-)

   var metaPressed = false;
   $(document).keydown(function(e) {
     console.log('keydown ' + e.keyCode);
     if (e.metaKey || e.ctrlKey) {
       console.log('meta pressed');
       metaPressed = true;
     }
   });
   $(document).keyup(function(e) {
     console.log('keyup ' + e.keyCode);
     if (e.metaKey || e.ctrlKey) {
       console.log('meta unpressed');
       metaPressed = false;
     }
   });

这是相关键的控制台输出

// Pressing cmd
keydown 91
meta pressed
keyup 91

// Pressing control 
keydown 17
meta pressed 
keyup 17

// Pressing non-meta like spacebar
keydown 32
keyup 32

【问题讨论】:

  • 不确定我明白了,是不是和预期的一样,keyup 事件会在按钮被释放时触发,所以 e.metaKey 将在此时为 false,即使 keyup 事件以正确的方式触发键码?

标签: javascript jquery keypress meta-key


【解决方案1】:

我现在明白了,我误解了 jQuery 如何处理修饰键。感谢@adeneo 的提示让我正确思考。

此外,如果您在按住元字符的同时按键,例如按 M-x,jQuery 不会发送 'x' 的 keyup,直到 'M' 也被释放。因此,您不必担心会发生“meta down、x down、x up、meta up”之类的事情

【讨论】:

    【解决方案2】:

    您将无法从 keyup 中检索该信息。我建议使用这个(e.keyCode === 17 || e.keyCode === 91) 作为测试用例(分别是 CTRL 和 META)

    【讨论】:

    • 这些键码取决于浏览器。
    • @Damien unixpapa.com/js/key.html。如果向下滚动,您将看到 CTRL 键在浏览器中是一致的。 Opera 不正确支持 Windows Meta,但它的浏览器使用份额无论如何都可以忽略不计(也不是 OP 的用例)
    • MacOS 上每个浏览器的 command 键代码不同,Safari 使用 2 个代码。见stackoverflow.com/a/3922353/438970
    【解决方案3】:

    我正在使用 React 并注意到同样的问题。 e.metaKey 适用于 keydown 但不适用于 keyup。但是,e.keyCode 两者都是 93。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 2015-01-16
      • 2011-08-30
      • 1970-01-01
      • 2012-05-26
      • 1970-01-01
      相关资源
      最近更新 更多