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

开发JavaScript俄罗斯方块:如何实现按住按钮重复执行函数?

实现按住按钮持续触发俄罗斯方块移动函数(原生JS,无jQuery)

嘿,我完全懂你的需求——给安卓手机端的俄罗斯方块加触摸按钮,按住的时候要持续调用right()这类移动函数,松开就停,而且不想用jQuery,还要符合你的JS知识水平对吧?其实这个需求用原生JS就能轻松实现,核心就是用setInterval和事件监听来控制定时器的启停,我给你一步步讲清楚:

核心思路

当用户按住按钮时,我们先立即执行一次目标函数(避免按住后有延迟才动,手感更自然),然后启动一个定时器,每隔固定时间重复调用这个函数;当用户松开按钮(或者鼠标/手指离开按钮),就清除这个定时器,停止重复调用。

通用代码实现

先写一个通用的工具函数,这样四个箭头按钮都能复用,不用重复写逻辑:

// 用来存储定时器的ID,方便后续清除
let holdTimer = null;

/**
 * 启动按住动作:立即执行一次目标函数,然后定时重复执行
 * @param {Function} action - 要重复执行的函数(比如right()、left())
 * @param {number} interval - 重复执行的间隔时间(毫秒,默认100ms,可根据手感调整)
 */
function startHold(action, interval = 100) {
  // 先立即执行一次,提升操作手感
  action();
  // 启动定时器,每隔interval毫秒执行一次action
  holdTimer = setInterval(action, interval);
}

// 停止按住动作:清除定时器
function stopHold() {
  if (holdTimer) {
    clearInterval(holdTimer);
    holdTimer = null;
  }
}

给单个按钮绑定事件(以右键为例)

假设你的右键按钮HTML是这样的:

<button id="right-btn">→</button>

然后给它绑定鼠标和触摸事件(兼顾PC和手机端):

// 获取右键按钮元素
const rightButton = document.getElementById('right-btn');

// 鼠标按下 / 触摸开始时,启动按住动作
rightButton.addEventListener('mousedown', () => startHold(right));
rightButton.addEventListener('touchstart', (e) => {
  // 阻止触摸事件的默认行为,避免手机页面滚动/缩放
  e.preventDefault();
  startHold(right);
});

// 鼠标松开 / 鼠标离开按钮 / 触摸结束时,停止按住动作
rightButton.addEventListener('mouseup', stopHold);
rightButton.addEventListener('mouseleave', stopHold);
rightButton.addEventListener('touchend', stopHold);

复用逻辑到其他按钮

剩下的左、上、下按钮,只需要替换对应的按钮ID和目标函数就行,比如左键:

const leftButton = document.getElementById('left-btn');
leftButton.addEventListener('mousedown', () => startHold(left));
leftButton.addEventListener('touchstart', (e) => {
  e.preventDefault();
  startHold(left);
});
leftButton.addEventListener('mouseup', stopHold);
leftButton.addEventListener('mouseleave', stopHold);
leftButton.addEventListener('touchend', stopHold);

注意事项

  • 调整间隔时间:startHold函数的第二个参数默认是100毫秒,你可以根据游戏的手感调整,比如改成80ms会让移动更快,150ms更慢。
  • 触摸事件的preventDefault:一定要加,不然在手机上按住按钮时,可能会触发页面的滚动或缩放,严重影响游戏体验。
  • mouseleave事件:加上这个是为了防止用户按住按钮后,鼠标/手指不小心移开按钮,但函数还在持续调用的情况,让逻辑更严谨。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:47:49