【问题标题】:How to see if a modifier key is being held down without catching the keydown event?如何在不捕获 keydown 事件的情况下查看修改键是否被按住?
【发布时间】:2017-07-16 01:13:43
【问题描述】:

我知道如何捕捉 keyup 和 keydown 事件。

我希望我的程序查看当前正在按住哪些修饰键(例如:元键、控制键、alt 键等),即使程序没有观察到这些键的按键事件。

我知道点击事件和其他事件可以告诉我在触发它们时按下了哪些修改键,但我的程序不能等待一个发生。

我需要我的程序定期检查修饰键(例如,每 100 毫秒)。我该怎么做呢?如果有帮助,我的程序会使用 jQuery。

【问题讨论】:

  • 除非您使用事件监听器,否则无法做到这一点。
  • 您的意思是我需要触发一个实际事件(而不是模拟事件)才能知道按下了哪些修饰键?
  • 如果下面的答案不能接受,我会说你很可能有一个 X Y 问题。不要告诉我们你想要做什么,而是解释你真正想要解决的问题。也就是说,你为什么要这样做?可能有更好的方法。

标签: javascript jquery web google-chrome-extension


【解决方案1】:

您可以将这些值存储在变量中,并随时检查它们。当然需要一个事件监听器来更新该变量:

// assume no hot key is pressed

var object = {
  ctrlKey: false,
  altKey: false,
  shiftKey: false
};

// update whenever a keydown or keyup event is fired

document.addEventListener("keydown", function(e) {
  for(var key in object) {
    if(object.hasOwnProperty(key))
      object[key] = e[key]; // update the object from the event e
  }
});

document.addEventListener("keyup", function(e) {
  for(var key in object) {
    if(object.hasOwnProperty(key))
      object[key] = e[key];
  }
});

// testing example:

function check() {
  console.log("Checking:");
  console.log("Alt key:", object.altKey);
  console.log("Ctrl key:", object.ctrlKey);
  console.log("Shift key:", object.shiftKey);
}

setInterval(check, 1000); // calling check every second without waiting for an event to occur

【讨论】:

  • 不幸的是,问题是我的程序无法从您的第一行做出假设。它不知道修改键最初是否被按住。
  • @Sophtware 该程序没有做出这样的假设,它只是从未按下的键开始。除非您的用户在按住修改键的同时加载页面,否则这应该可以工作
  • @Sophtware 好吧,我认为没有其他方法。模拟事件似乎并不能说明是否按下了热键。
  • @ibrahimmahrir 是的,我认为是这样。当我尝试时它不起作用,但我希望我做错了什么或有其他方法。
【解决方案2】:

聚会迟到了,但由于这显示在 Google 上,这里有一个更接近一步的部分解决方案。来自this SO answer

document.body.onkeydown = function(e) {
  if (e.which === 18) {
    alt_state.textContent = 'pressed';
  }
};

document.body.onkeyup = function(e) {
  if (e.which === 18) {
    alt_state.textContent = 'released';
  }
};

function detectAlt() {
  if (document.webkitHidden) return;
  window.addEventListener('mousemove', function onMove(e) {
    alt_state.textContent = e.altKey ? 'pressed' : 'released';
    window.removeEventListener('mousemove', onMove, false);
  }, false);
}

document.addEventListener('webkitvisibilitychange', detectAlt, false);
window.addEventListener('load', detectAlt, false);

基本上,设置一个mousemove 事件侦听器,其中包含触发时的修饰键状态,并在第一次触发后移除侦听器。同样,仍然需要一个“事件”,但取决于您的应用程序的预期使用情况,捕获第一个 mousemove 事件可能足以检测修饰键。

【讨论】:

    猜你喜欢
    • 2011-01-12
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多