当前位置: 首页 > 知识库问答 >
问题:

如何在不捕获keydown事件的情况下查看是否按住了修饰符键?

易奇希
2023-03-14

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

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

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

我需要我的程序定期检查修饰符键(例如,每100毫秒)。我将如何做到这一点?如果有帮助,我的程序使用jQuery。

共有2个答案

盖博简
2023-03-14

派对晚了,但是由于这在Google上显示,这里有一个部分解决方案,离我们更近了一步。从这个SO答案:

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);

本质上,设置一个<code>mousemove</code>事件监听器,它包含触发时的修饰符键状态,并在第一次触发监听器后删除该监听器。同样,仍然需要一个“事件”,但根据应用程序的预期用途,捕获第一个<code>mousemove</code>事件可能足以检测修改键。

支铭晨
2023-03-14

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

// 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
 类似资料:
  • 问题内容: 我正在使用Qt Designer构建UI,并且我希望按钮使用不同的修饰符执行不同的操作。因此,我认为我可以调用具有动态字符串属性的函数,这些函数将根据修饰符执行操作。 如果有人知道更简单的方法,我将不胜感激。 问题答案: 看起来您需要做的就是检查按钮处理程序中的keyboardModifiers,并根据需要选择其他操作。可以对各种修饰符进行“或”运算以检查多键组合: PyQt5 : P

  • 本文向大家介绍vue事件修饰符和按键修饰符用法总结,包括了vue事件修饰符和按键修饰符用法总结的使用技巧和注意事项,需要的朋友参考一下 之前关于vue事件修饰符和按键修饰符的一点分析,最近需要回顾,就顺便发到随笔上了 在事件处理程序中调用 event.preventDefault() 或 event.stopPropagation() 是非常常见的需求。尽管我们可以在 methods 中轻松实现这

  • 问题内容: 我在一个项目中工作,我需要为每个对象添加一个快捷键,同时查找另一个类似的问题,并且在使用其他自定义s时,我决定在每个s 上使用该方法,但是这需要我按- “触发” 我班上的方法。 我如何修改此类以仅按- 并获得相同的行为? 这是我编写的用于演示此问题的代码: 问题答案: 您如何将任何键绑定到Swing中的组件?按键绑定:按键绑定教程。 等一下,我看看您的代码… 例如 因为通常JRadio

  • 问题内容: 如何在Java中查看Object是否是不使用反射的数组?而且如何在不使用反射的情况下遍历所有项目? 我使用Google GWT,所以我不允许使用反射:( 我很想在不使用反射的情况下实现以下方法: 顺便说一句:我也不想使用JavaScript,这样我就可以在非GWT环境中使用它。 问题答案: 您可以使用 这适用于对象和原始类型数组。 对于toString,请看一下。您必须检查数组类型并调

  • 我遇到了一个奇怪的JavaScript问题。我正在开发一个使用键盘输入的HTML5画布游戏。游戏的双人模式需要按住键盘上最多6个键。 在我按住键盘上的4或5个键后,似乎停止调用“keyDown”事件。 我使用的代码如下: 控制台应该为我按下的每个键记录一个键代码。然而,它似乎只报告我按住的前4或5个键的密码。这导致了当两个玩家按下太多键时,我的游戏的双玩家版本的控件无法工作。 这是一个bug,是J

  • 我遇到了这个PHP代码使用SMTP检查电子邮件地址而不发送电子邮件。 有没有人尝试过类似的方法,或者对你有用吗?你能判断客户/用户输入的电子邮件是否正确和是否存在吗?