必须在form.on('submit')回调末尾加return false或e.preventdefault()阻止默认提交,否则页面跳转导致layer.msg中断、ajax失效、表单清空失败;同时需规范button type属性并拦截回车键。

form.on('submit') 回调里必须 return false 或 preventDefault
页面刷新的根源是浏览器执行了表单原生提交行为。Layui 的 form.on('submit') 只是监听事件,不自动阻止默认动作。漏掉这一步,哪怕后面写了 AJAX,页面照样跳转或刷新。
常见错误写法:form.on('submit(filter)', function(data){ $.ajax({...}); })——没 return,也没 e.preventDefault(),请求发出去前页面就丢了。
推荐写法(两种任选):
form.on('submit(filter)', function(data){ /* 处理逻辑 */ return false; });form.on('submit(filter)', function(data){ var e = data.elem.form || data.form; e.preventDefault(); /* 处理逻辑 */ });
注意:不要在回调开头就 return false 之前做校验或异步操作,否则会提前中断流程;校验失败时也得 return false,否则可能绕过提示直接提交。
别让 button 的 type=submit 暗中触发刷新
很多“点了就刷新”问题其实和 Layui 无关,而是 HTML 层级的陷阱:嵌在 <form class="layui-form"></form> 里的 <button></button>,如果不显式声明 type,浏览器默认按 type="submit" 处理。
错误示范:<button lay-submit lay-filter="myForm">提交</button> —— 在 Chrome/Firefox 中点一下就刷新。
正确写法(二选一):
- 显式加
type="button",再用 JS 手动触发表单校验+提交:<button type="button" class="layui-btn" id="manualSubmit">提交</button> - 保留
lay-submit,但确保type="submit"并配合return false(见上一条)
特别注意重置按钮:<button>重置</button> 同样默认是 submit,必须写成 <button type="button">重置</button>,否则点一下就刷新。
回车键也会触发刷新,得单独拦截
用户在任意 <input> 里按回车,只要它在 <form></form> 内,浏览器就会自动触发表单提交——这个行为和 Layui 无关,但常被忽略。
解决方式不是改 Layui,而是监听键盘事件:
- 给表单容器加 ID,比如
id="myForm" - 在 JS 里绑定:
document.getElementById('myForm').addEventListener('keydown', function(e){ if(e.keyCode === 13){ e.preventDefault(); } });
如果用了 jQuery:$('#myForm').on('keydown', 'input, select, textarea', function(e){ if(e.keyCode === 13) e.preventDefault(); });
注意:别只监听某个 input,要覆盖所有可编辑字段,否则换一个框按回车又刷新。
layer.msg 不弹出?大概率是页面已经跳走了
很多人发现 layer.msg('成功') 没反应,其实是消息刚创建,页面就刷新了。这不是 layer 加载问题,而是 form.on('submit') 没拦住默认行为。
验证方法:打开浏览器 DevTools → Network 标签页,点提交,看有没有新请求发起(如 GET /xxx)。如果有,说明没拦住;如果只有你写的 AJAX 请求,那才是正常流程。
另一个隐蔽坑:重复引入 layui.js 或同时加载 layui.js 和 layui.all.js,会导致 form.on('submit') 绑定多次,一次点击触发多轮提交+多轮刷新,现象更难排查。











