最有效防重复提交是严格绑定禁用至请求生命周期:submit回调开头用prop('disabled',true)禁用按钮、改文字、加layui-btn-disabled类,并在ajax的complete中统一恢复;只禁用按钮,不碰表单项,避免校验跳过。

直接禁用按钮是最有效、最可控的防重复提交手段,但必须严格绑定到请求生命周期,否则极易出现按钮卡死或校验跳过。
form.on('submit') 回调里第一时间禁用按钮
禁用动作必须写在回调函数最开头,且用 prop('disabled', true) 而非 attr——后者不触发 DOM 属性变更语义,部分浏览器下无效。同时要同步更新按钮文字(如改成「提交中…」)和添加 layui-btn-disabled 类,提供视觉反馈。
- 正确写法:
$(this).prop('disabled', true).text('提交中…').addClass('layui-btn-disabled') - 错误写法:
$(this).attr('disabled', 'disabled'),状态不可靠 - 别在禁用前调用
return false,否则事件中断,后续逻辑不执行 - 如果表单用了
layui.form.render()重绘,禁用状态会被重置,需在 render 后手动再设一次
验证通过后再发请求,不能颠倒顺序
Layui 的 form.verify() 会跳过所有 disabled 的表单项。如果你顺手把输入框也禁用了,必填项就不再校验——用户点一下就绕过前端校验直奔后端。
- 只禁用按钮,绝对不要对
input、select等字段加disabled - 异步验证(如用户名是否已存在)必须等
done(true)回调完成,再执行禁用 + 提交,否则 UI 会提前锁死 - 若验证失败,按钮必须立刻恢复可点击状态,否则用户无法修改后重试
成功、失败、超时三路径都要恢复按钮
仅在 success 回调里恢复按钮是常见坑。网络超时、500 错误、甚至用户切页再切回,都可能导致按钮长期处于 disabled 状态,整个表单瘫痪。
- 必须在
$.ajax()的complete钩子中统一恢复:$(this).prop('disabled', false).text('提交').removeClass('layui-btn-disabled') - 避免用
setTimeout模拟“2秒后恢复”,网络延迟不可控,该卡还是卡 - 移动端要注意
touchstart阶段拦截:安卓 WebView 或旧 iOS 存在 300ms click 延迟,用户连点可能触发两次,建议在touchstart就禁用,而非等click
别重复加载 layui.js 或 layui.all.js
重复引入会导致 form.on('submit') 绑定多次,一个点击触发多轮提交——这是最隐蔽也最常被忽略的根源。
- 检查 HTML 中是否同时存在
layui.js和layui.all.js - 确认没有在不同
<script></script>标签里重复<script src="layui.js"></script> - 如果用了
form.on('submit')却发现事件触发两次,优先排查这个
真正难的不是“怎么禁用”,而是“什么时候恢复”和“恢复是否全覆盖”。按钮一旦卡死,用户只能刷新页面——而这时候你根本收不到任何报错日志。











