必须在form.on('submit()')回调首行加e.preventDefault()或return false,否则浏览器执行原生提交导致跳转;layui仅监听事件而非拦截,未阻止时GET重载页面、POST跳转至响应地址。

必须在 form.on('submit()') 回调里显式阻止默认行为,否则浏览器会按原生逻辑提交并跳转——这是 90% 的“页面刷新”问题根源。
为什么 return false 或 preventDefault 是必需的
layui 的 form.on 只是事件监听器,不是拦截器。它不会自动取消表单的原生提交动作。一旦验证通过(或没设验证),浏览器立刻执行 <form action=""> 的默认行为:GET 请求则重载当前页,POST 则跳转到响应地址(常为空白页或 404)。
- 写法一(推荐):
form.on('submit(submitBtn)', function(data){ /* 你的逻辑 */ return false; }); - 写法二(更明确):
form.on('submit(submitBtn)', function(data){ data.field; // 表单数据 e.preventDefault(); // 注意:data 对象里没有 e,得从外层捕获 event 或改用原生事件委托 } ); - 错误写法:
form.on('submit()', function(){ $.ajax({...}); });—— 没有 return、没 prevent,必定跳转
button 类型不写 type="button" 就会偷偷提交
尤其在弹窗(layer.open iframe)或搜索区域里,一个没加 type 的 <button>,浏览器默认当 type="submit" 处理。点“取消”“关闭”按钮,结果触发表单提交,页面闪一下就跳了。
- 修复方式:所有非提交用途的按钮都显式声明
<button type="button">取消</button> - 特别注意弹窗里的“保存”和“取消”共存时,“取消”按钮最容易漏掉
type - 如果用了
<input type="button">或<input type="submit">,也需确认是否绑定了 submit 监听
清空表单 + 阻止跳转 ≠ 页面不刷新
很多人以为调了 form.val("filterName", {}) 或 $("#form")[0].reset() 就万事大吉,但只要没阻止默认行为,清空完表单照样提交跳转。
-
$("#myForm")[0].reset()对 layui 的select、laydate、switch等组件完全无效——它们是 DOM 模拟渲染的 - 正确清空流程:先
form.val("searchForm", {}),再layui.form.render(),最后确保回调里有return false - 日期控件要额外处理:
$("#dateField").val(""); laydateIns.setValue("");
iframe 子页面提交后父页跳转的错觉
在 layer.open({type: 2, content: "xxx.html"}) 里提交表单,如果子页没阻止默认行为,整个 iframe 会加载响应内容(比如返回一个纯文本或跳转页),看起来像“父页跳转”,其实是 iframe 自身刷新了。
- 子页 JS 必须写
form.on('submit(...)', function(){ ... return false; }); - 提交成功后关弹窗:
parent.layer.close(parent.layer.getFrameIndex(window.name)); - 别在子页写
parent.location.reload(),会丢筛选条件;该用parent.layui.table.reload("tableId", {where: {...}})
最常被忽略的点:阻止默认行为这一步,不能靠“好像没跳”来验证——得看 Network 面板有没有发那个原生 form 请求,或者控制台有没有 Uncaught TypeError 导致 return false 没执行到。写完务必真机点一次,别只信本地测试。


















