延迟反馈导致用户重复点击怎么办?
我在做一个表单提交功能,用户点击“提交”后要等大概2秒才有响应(后端处理慢)。结果用户以为没点上,疯狂点好几次,最后提交了多份相同数据。我试过加 loading 状态禁用按钮,但有时候网络特别差,loading 显示也有延迟,还是会被连点。
现在代码是这样:
function handleSubmit() {
submitBtn.disabled = true;
submitBtn.textContent = '提交中...';
fetch('/submit', { method: 'POST' })
.then(res => res.json())
.then(data => { /* 处理成功 */ })
.finally(() => {
submitBtn.disabled = false;
submitBtn.textContent = '提交';
});
}
但偶尔第一次点击后按钮还没变灰,用户就已经点了第二次。有没有更可靠的防重复提交方案?
简单来说就是在开始请求时记录一个状态,在请求结束前阻止任何新请求。可以用个标志位搞定:
这样即使用户狂点也没用,因为请求还在进行时直接return了。记得在 finally 里解锁。这个方案简单粗暴,但很有效。至于用户体验方面,再优化下 loading 效果就更完美了。开发这么多年,这种防抖动操作真是必备技能啊。