点预约按钮后页面没变化,按钮也没转圈,用户以为没提交,连着点了五次,后台多出五条同一手机号的预约。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

btn.disabled = true;
btn.textContent = '提交中…';
fetch('/api/booking', { method: 'POST', body: formData })
  .then(() => { tip.textContent = '预约成功,我们会尽快联系你'; })
  .finally(() => { btn.disabled = false; });

提交走了 fetch,成功后只打了一条 console.log,没有更新按钮状态和页面提示。按钮没禁用,重复请求全部打到接口。这一点先确认清楚,后面就不用反复试。

「预约表单提交无反馈」这类改动最怕改一半,回滚脚本先准备好,再动生产。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

具体做法是,提交开始就把按钮置灰并显示处理中,成功后给明确文案;接口侧用手机号加时间段做唯一约束,重复提交返回同一条;失败也要恢复按钮,并保留用户填的内容。

改完照着核一遍,点一次预约,按钮立即变灰,成功后出现提示,后台只有一条记录。

作者 9823189