Javascript 检测忽略修改键的按键

Javascript 检测忽略修改键的按键,javascript,Javascript,我正在为我的网站实现空闲超时功能。我想在用户与页面交互时重置空闲超时,我想实现为“用户单击页面上的任意位置”或“用户键入密钥” 以下代码起作用: window.addEventListener('click', resetTimeout); window.addEventListener('keydown', resetTimeout); 不幸的是,它检测到修改键(alt、shift、ctrl、meta)。在这种情况下,我不想重置超时。例如,当用户alt+tab转到另一个窗口时,alt键会重置

我正在为我的网站实现空闲超时功能。我想在用户与页面交互时重置空闲超时,我想实现为“用户单击页面上的任意位置”或“用户键入密钥”

以下代码起作用:

window.addEventListener('click', resetTimeout);
window.addEventListener('keydown', resetTimeout);
不幸的是,它检测到修改键(alt、shift、ctrl、meta)。在这种情况下,我不想重置超时。例如,当用户alt+tab转到另一个窗口时,alt键会重置超时


keydown
的另一种替代方法是
keypress
,但实际上是。是否有专门针对我描述的情况的
按键的替代方法?

添加功能并检查命令键,如下所示:

document.addEventListener("keydown", function(event) {
  event.preventDefault();
  const key = event.keyCode; //You can also use event.key to get the text value. e.g. "Alt", "Ctrl"
  if(key != 17 && key != 18) //Alt and Ctrl keys. key should not 17 as well as 18 then resetTimeOut.
  {
       resetTimeout();
  }
});
如果要使用.key,则可以使用字符串并检查该字符串中是否存在按下的键

document.addEventListener("keydown", function(event) {
      event.preventDefault();
      const key = event.key
      if(! "Alt,Control,Tab".split(",").includes(key))
      {
           resetTimeout();
      }
    });

注意要排除密钥,您可以添加所有不需要的密钥。您可以在此处搜索它们:


您需要一个变量来保持一个true/false,它告诉您是否按下了一个被忽略的键,如果是,那么您可以忽略所有会重置计时器的keydown事件。释放忽略的密钥后,您可以监听keydown事件

下面是一个小演示:

const display=document.getElementById('status');
让空闲时间=0;
常量计时器\u cb=\u=>{
如果(空闲时间>5){
display.innerText=“您现在处于空闲状态”;
清除间隔(计时器);
}否则{
display.innerText=“您已处于非活动状态达:“+idleTime+”秒”;
空闲时间++;
}
}
设定时器=设定间隔(定时器×cb,1000);
const ignoreKeys=新集合(['Meta','Control','Shift','Alt']);
让我们忽略=错误;
常量重置超时=({key})=>{
ignore=ignore | | ignoreKeys.has(key);
如果(!忽略){
空闲时间=0;
定时器_cb();
清除间隔(计时器);
定时器=设定间隔(定时器×cb,1000);
}
};
常量确认=({key})=>{
忽略=!!(忽略^ignoreKeys.has(key));
}
window.addEventListener('单击',重置超时);
addEventListener('keydown',resetTimeout);
window.addEventListener(“键控”,确认);
定时器_cb()

请参阅。在resetTimeout函数中添加一些条件。它如何检测
alt
if
keydown
,因为它们是不同的事件。您可以检测事件类型。请参阅。像“如果
e.shiftKey
,则忽略”这样的条件不起作用,因为它也会忽略,例如,shift+a.
事件。keyCode
也被弃用。event.key是否可用?是的,但我试图避免枚举所有
LeftShift
RightShift
LeftCtrl
,etc.@crazypeter您可以使用
'LeftShift righshift LeftCtrl(etc)'.split('').includes(event.key)
,这似乎相当昂贵,因为每次按键都会执行。但我猜
event.key
只有四个相关值,
Shift
Alt
Ctrl
Meta
。该解决方案还忽略了,例如,“Shift+A”,这是重置超时的合法键。我想只要有
ignoreKeys
数组并检查它就行了(没有
ignore
状态)。我只是很惊讶,与没有任何额外工作的
onkeypress
所提供的解决方案相比,所有这些解决方案是多么昂贵。
let excludedKeys = ["Alt"];
window.addEventListener('keydown', e => {
  if(!excludedKeys.includes(e.key)) resetTimeout();
});