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

jQuery绑定keydown事件时e.repeat不生效且控制台无报错如何解决

问题原因及修复方案

核心问题1:e.repeat 取值错误

jQuery 封装的事件对象没有透传原生 DOM 事件的 repeat 属性,你代码中读取的 e.repeat 实际值为 undefined,导致判断 if (e.repeat) { return } 永远不会触发,自然无法拦截长按重复事件。
要修复这个问题,需要从 jQuery 事件对象的 originalEvent 属性中读取原生事件的 repeat 值,修改判断为:

if (e.originalEvent.repeat) { return }

问题2:重复绑定 keyup 事件

你将 keyup 事件的绑定逻辑放在了 keydown 回调内部,每次按下有效按键都会给全局 document 新增一个 keyup 监听,这些监听不会自动销毁,长期运行会导致内存泄漏,也会产生大量冗余执行逻辑。
正确的做法是将 keyup 绑定移到 keydown 绑定外部,全局只绑定一次即可。


优化后完整代码参考

// 全局只绑定一次keyup
$(document).on('keyup', function() {
    $('.box').removeClass('active');
});

$(document).on('keydown', function(e) {
    // 从原生事件取repeat属性
    if (e.originalEvent.repeat) { return }
    // 统一转小写简化判断逻辑
    const key = e.key.toLowerCase();
    let $targetBox;
    switch(key) {
        case 'q':
            $targetBox = $('.box.green');
            break;
        case 'w':
            $targetBox = $('.box.red');
            break;
        case 'a':
            $targetBox = $('.box.yellow');
            break;
        case 's':
            $targetBox = $('.box.blue');
            break;
        default:
            return;
    }
    $targetBox.addClass('active').click();
});
// 确保userPattern变量提前声明
var userPattern = [];
var boxName = ['Q', 'W', 'A', 'S'];

$('.box').click(function() {
    userPattern.push(boxName.indexOf(this.textContent));
    console.log(boxName.indexOf(this.textContent));
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:24:07