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

如何解决单次按键触发多次keydown事件的问题

解决按键按住时keydown多次触发的问题

这是操作系统默认的按键重复行为——按住按键时,系统会持续触发keydown事件,直到你松开按键。要实现单次按键只触发一次位置更新,可以通过记录按键状态来避免重复处理:

修正后的代码方案

// 用集合存储当前处于按下状态的按键
const pressedKeys = new Set();

window.addEventListener('keydown', e => {
    if (renderBall && !pressedKeys.has(e.key)) {
        pressedKeys.add(e.key);
        
        if (e.key === 'ArrowLeft') {
            setBallPosition({
                ...ballPosition,
                left: parseInt(ballPosition.left) - 5 + 'px',
            });
        } else if (e.key === 'ArrowUp') {
            setBallPosition({
                ...ballPosition,
                top: parseInt(ballPosition.top) - 5 + 'px',
            });
        } else if (e.key === 'ArrowRight') {
            setBallPosition({
                ...ballPosition,
                left: parseInt(ballPosition.left) + 5 + 'px',
            });
        } else if (e.key === 'ArrowDown') {
            setBallPosition({
                ...ballPosition,
                top: parseInt(ballPosition.top) + 5 + 'px',
            });
        }
    }
});

// 按键松开时,从集合中移除对应按键
window.addEventListener('keyup', e => {
    pressedKeys.delete(e.key);
});

关键说明

  1. 状态记录:用Set存储当前按住的按键,确保同一个按键的keydown事件只有第一次会被处理
  2. 修正逻辑漏洞:把原代码中ArrowDown的if改为else if,避免和前面的条件分支冲突导致重复执行
  3. 重置状态:通过keyup事件移除集合中的按键,保证下次按下时能正常触发

内容的提问来源于stack exchange,提问作者Ansari iftekhar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 14:40:15