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

setInterval每次触发后速度递增:JS自学中div移动速度异常问题

问题原因与修复方案

问题核心在于每次按下空格键都会新建一个setInterval定时器,但旧的定时器从未被清除——多个定时器同时修改火箭位置,自然会让移动速度叠加变快。

具体修复步骤:

  • 声明一个变量专门保存定时器ID,方便后续清除
  • 每次创建新定时器前,先清除之前的定时器
  • 火箭移出屏幕后,及时清除定时器,避免无用的资源消耗

修改后的代码示例:

// 在全局或合适的作用域中声明定时器变量
let rocketInterval;

window.addEventListener('keydown', (event) => {
    switch (event.key) {
        case ' ':
            if (posLeft > canvasWidth - 100 || Rocket.style.visibility != 'hidden') {
                Rocket.style.visibility = 'hidden';
                // 隐藏火箭时同步清除定时器
                clearInterval(rocketInterval);
            } else {
                Rocket.style.visibility = 'visible';
                console.log(posLeft);
                Rocket.style.left = (Player.offsetLeft + Player.offsetWidth) + 'px';
                Rocket.style.top = (Player.offsetTop + Player.offsetHeight / 2.5) + 'px';
                
                // 先清除旧定时器,避免多实例叠加
                clearInterval(rocketInterval);
                // 创建新定时器并保存ID,建议显式设置间隔(16ms接近60帧,动画更平滑)
                rocketInterval = setInterval(function () {
                    if (rocketLeft < canvasWidth) {
                        rocketLeft++;
                        console.log(rocketLeft);
                        Rocket.style.left = parseInt(Rocket.style.left, 10) + 1 + 'px';
                    } else {
                        // 火箭移出屏幕后,清除定时器并重置状态
                        clearInterval(rocketInterval);
                        Rocket.style.visibility = 'hidden';
                        rocketLeft = 0;
                    }
                }, 16);
            }
            break;
    }
});

额外提示:原代码中setInterval未指定时间间隔,浏览器会使用默认值(通常10ms左右),显式设置间隔能让动画速度更稳定可控。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:47:25