如何在不捕获keydown事件的情况下查看修改键是否被按下?

时间:2017-07-16 01:13:44

标签: javascript jquery web google-chrome-extension

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

我希望我的程序看到哪些修改键(例如:元键,控制键,alt键等)当前正被按下,即使程序没有观察到这些键的keydown事件。 / p>

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

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

2 个答案:

答案 0 :(得分:3)

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

// 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

答案 1 :(得分:0)

晚些时候参加聚会,但是由于这已经显示在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事件可能足以检测出修饰键。