防连点有三种方案:一是禁用按钮+finally恢复,适用于表单;二是节流控制频率,适用于刷新类操作;三是Vue全局点击防抖拦截,需注意兼容性。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

当用户快速连续点击 AionClaw 中的提交按钮时,会触发多次相同接口请求,导致数据异常、后端压力陡增或前端状态错乱。
禁用按钮 + 请求完成恢复
这是最直接、兼容性最强的方案,适用于所有表单类操作按钮。
第一步:在按钮绑定的点击事件开头,获取当前按钮 DOM 元素并设为禁用状态。
第二步:执行 AJAX 请求(如 fetch 或 axios 调用)。
第三步:在 .then() 和 .catch() 之后统一使用 .finally() 恢复按钮可用性——【必须用 finally,否则请求失败时按钮将永久禁用】。
这一步操作起来很简单,直接把 disabled = true 写在请求前、finally 里写 false 就行,但漏掉 finally 是线上最常见的按钮锁死原因。
节流控制点击频率
适用于非表单类按钮(如“刷新列表”“加载更多”),不希望完全禁用按钮,但需限制最小触发间隔。
方法一:封装节流函数
定义 throttle(fn, delay) 函数,内部记录上一次执行时间戳,仅当当前时间与上次差值 ≥ delay 才执行 fn。
方法二:直接绑定节流后的 click 处理器
document.getElementById('refreshBtn').addEventListener('click', throttle(() => { loadMore(); }, 1500));
注意:节流时间建议设为 1000~2000ms,太短起不到防连点作用,太长影响正常交互节奏。
全局点击防抖拦截(Vue 项目适用)
若项目基于 Vue 2,可在 main.js 中统一拦截所有 click 事件,自动添加防抖逻辑。
复制以下代码到 main.js 靠前位置:
const on = Vue.prototype.$on;
Vue.prototype.$on = function(event, func) {
let timer;
let newFunc = func;
if (event === 'click') {
newFunc = function() {
clearTimeout(timer);
const context = this;
const args = arguments;
timer = setTimeout(() => {
func.apply(context, args);
}, 800);
};
}
on.call(this, event, newFunc);
};
【该方案会覆盖所有组件的 $on('click') 行为,请确保项目中无自定义 click 事件监听依赖即时响应】











