You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何每5秒检测右箭头键是否按下?现有代码仅生效一次求排查

问题分析与解决方案

嘿,我来帮你看看问题出在哪~

你的代码之所以只能触发一次提醒,核心有两个问题:

1. 定时器调用函数时缺少事件参数

你用setInterval(KeyPressed, 5000)每隔5秒调用一次KeyPressed,但这个时候并没有传递键盘事件对象k。当定时器执行函数时,k是undefined,访问k.keyCode会直接抛出错误,导致定时器的后续执行被中断,所以只有你手动按下右箭头时(此时onkeydown会传递事件对象),函数才会正常执行弹出提醒。

2. 逻辑误解了“检测按键是否按下”的方式

你的需求是每5秒检测右箭头是否处于被按下的状态,但onkeydown只是在按键按下的瞬间触发一次,无法持续跟踪按键状态。要实现定时检测,我们需要先记录按键的按下/释放状态,再定时检查这个状态。


修正后的代码

这里给你调整后的实现,同时推荐使用更现代的e.key替代已弃用的keyCode:

// 记录右箭头的按下状态
let isRightArrowPressed = false;

// 监听按键按下事件,更新状态
window.addEventListener('keydown', (e) => {
  if (e.key === 'ArrowRight') {
    isRightArrowPressed = true;
  }
});

// 监听按键释放事件,更新状态
window.addEventListener('keyup', (e) => {
  if (e.key === 'ArrowRight') {
    isRightArrowPressed = false;
  }
});

// 每5秒检测一次状态
setInterval(() => {
  if (isRightArrowPressed) {
    alert("Right Arrow is being pressed!");
  }
}, 5000);

这样修改后,只要右箭头处于按下状态,每隔5秒就会弹出提醒;松开按键后,提醒就会停止啦。

内容的提问来源于stack exchange,提问作者Clint Anumudu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:16:31