【问题标题】:How to the detect when a combination of keys is no longer pressed?如何检测何时不再按下组合键?
【发布时间】:2014-07-29 05:08:33
【问题描述】:

这就是我想要实现的(我已经简化了场景):

  1. 用户按下Ctrl + Tab,出现一个隐藏的div#my_div
  2. 用户在按住 Ctrl 的同时释放 Tab,因此 div#my_div 仍然可见
  3. 用户在按住 Ctrl 的同时按下 Tab,所以div#my_div 变为随机颜色
  4. 用户释放Ctrl,所以div#my_div被隐藏

这类似于 Windows 上的 Alt + Tab 键盘事件,其中这些键的组合会触发切换窗口的快捷方式。并且该快捷方式在 Alt 被按下时保持可见并在 Alt 被释放的那一刻消失,并且在 Tab 之间可以按下几次。

我可以检测到 Ctrl + Tab,但是一旦我释放 TabCtrl 按键事件就会触发,即使它被按下:

$(window).keydown(function(e)
{
    if(e.ctrlKey && e.which === 9)
    {
        console.log("ctrl+tab");
        e.preventDefault();
    }
});

$(window).keyup(function(e)
{
    if(e.which === 9)
    {
        console.log("tab");
        e.preventDefault();
    }
});

$(window).keyup(function(e)
{
    if(e.ctrlKey)
    {
        console.log("end of feature");
        e.preventDefault();
    }
});

我怎样才能完成这项任务?

【问题讨论】:

  • 请注意,大多数浏览器上的Ctrl+Tab 是您在浏览器选项卡之间移动的方式...可能有点问题,用户不喜欢他们的导航习惯受到干扰...跨度>

标签: jquery keyboard-events key-bindings


【解决方案1】:

您只是在您的keyup 处理程序中缺少!:您希望在他们释放 Ctrl 键时完成,对吗?所以!e.ctrlKey:

$(window).keyup(function(e)
                {
  if(!e.ctrlKey)
  {
    console.log("end of feature");
    e.preventDefault();
  }
});

【讨论】:

  • 哇,成功了!但为什么?呵呵,我的意思是,我不应该实际检测到 ctrlKey 吗? ! 让我很困惑
  • @Matías: ctrlKeyCtrl 键当前是否关闭的标志(真/假)。因此,如果我们看到 keyup 并且 Ctrl 键没有按下(! 是布尔值“不”),我们就完成了。
  • 嘿 TJ,发生的事情是即使我在文本框中键入 keyup 事件也会触发。我不希望这种情况发生。有什么想法吗?
  • @Matías:事件“冒泡”(传播)从它们起源的元素到其父级,然后是 父级,等等。事件对象有一个 target属性告诉你事件起源于哪个元素。所以你可以在你的处理程序中做这样的事情:if ($(e.target).closest("input, textarea, select")[0]) { /* Event came from a form field */ } else { /* It didn't */ }
  • 谢谢!我会试试的
猜你喜欢
  • 2017-07-31
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 2010-10-24
  • 1970-01-01
  • 2022-11-17
  • 2016-03-30
  • 1970-01-01
相关资源
最近更新 更多