贝利信息

如何防止用户重复点击按钮触发未完成的动画函数

日期:2025-12-29 00:00 / 作者:聖光之護

通过禁用按钮并在动画结束后重新启用,可有效阻止用户在前一次动画执行完毕前再次触发函数,确保动画按序执行且不冲突。

在 JavaScript 动画开发中,一个常见痛点是:用户频繁点击按钮,导致多个 setInterval 实例同时运行,造成动画错乱、状态冲突甚至内存泄漏。上述代码中的 myFunction 启动了一个从左上角向右下角移动的红色方块动画(共 350px),但原始实现未做执行状态控制,因此连续点击会叠加定时器,使 pos 值异常递增、动画加速或跳变。

核心解决方案是「状态感知 + 按钮管控」

以下是优化后的完整实现:

window.addEventListener('DOMContentLoaded', () => {
  const myBtn = document.getElementById("myBtn");
  const elem = document.getElementById("myAnimation");
  let id = null;
  let pos = 0;

  const frame = () => {
    if (pos === 350) {
      clearInterval(id);
      myBtn.disabled = false; // ✅ 动画结束,恢复按钮
    } else {
      pos++;
      elem.style.top = pos + 'px';
      elem.style.left = pos + 'px';
    }
  };

  const myFunction = () => {
    pos = 0;                 // ✅ 重置位置,确保每次从起点开始
    clearInterval(id);         // ✅ 清除可能残留的旧定时器
    id = setInterval(frame, 10);
    myBtn.disabled = true;     // ✅ 立即禁用,防重复触发
  };

  // 页面加载 3 秒后自动播放一次
  setTimeout(myFunction, 3000);
  // 绑定用户点击事件
  myBtn.addEventListener("click", myFunction);
});

关键改进点总结

⚠️ 注意事项

该方案简洁、可靠、无依赖,适用于任何基于定时器的顺序执行控制场景。