通过禁用按钮并在动画结束后重新启用,可有效阻止用户在前一次动画执行完毕前再次触发函数,确保动画按序执行且不冲突。
在 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);
});✅ 关键改进点总结:
⚠️ 注意事项:
该方案简洁、可靠、无依赖,适用于任何基于定时器的顺序执行控制场景。