最常见原因是未阻止表单默认提交行为,导致页面跳转中断layer.msg执行;必须在form.on('submit()')回调首行加e.preventDefault(),且layer.msg需置于AJAX success回调中。
最常见原因就是没阻止表单默认提交行为,页面跳转或刷新直接中断了 layer.msg() 的执行。layui 的 form.on 只是监听事件,不是拦截器。
必须在回调函数第一行写 e.preventDefault()(e 是事件参数),否则浏览器立刻走原生提交流程;如果用了 return false 也行,但推荐用 e.preventDefault() 更语义明确。
layer 已加载:Layui 2.8+ 默认内置,老版本需确认是否调用过 layui.use('layer')
layer.msg() 必须放在 success 回调里,别写在 form.on 外层layer.msg(),iOS Safari 容易堆叠失效甚至不显示layer.open 打开 iframe 类型弹窗后,子页面 DOM 不在当前 JS 上下文里,不能直接用 $('#form') 获取。
正确做法是通过 top.layer.getChildFrame('body', index) 或 layero.find('iframe').contents() 拿到子页面 document,再查表单元素:
var body = top.layer.getChildFrame('body', index); —— 推荐,兼容性好var formParam = body.find('#myForm').serialize(); —— 序列化整个表单body.find('#username').val(),注意 ID 要在子页面里存在form.submit() 直接提交,它无返回、难控制,容易导致列表刷新时机错乱这是编辑/新增弹窗最典型的收尾动作,关键是要拿到当前弹窗的索引,并通知父页重载数据。
不要硬写 parent.location.reload(),会丢失筛选条件和当前页码;优先用 table.reload() 精准刷新:
var index = layer.open({ ... });
layer.close(index);
parent.layui.table.reload('yourTableId', { where: { status: 'active' } });
parent.layer.getFrameIndex(window.name) 获取索引更健壮,比手动存变量更安全这不是 bug,是 HTML 默认行为:未声明 type 的 <button> 元素,浏览器一律当 type="submit" 处理。
尤其在弹窗里放了多个按钮(如“保存”“取消”),只要“取消”按钮没写 type="button",点它就会触发表单 submit 事件。
<button type="button" class="layui-btn layui-btn-primary">取消</button>
type 属性lay-submit,只给真正要提交的按钮加,其他按钮一律显式设 type="button"
真正麻烦的不是弹窗关不关,而是那个没写 type 的按钮,在你调试时根本不会报错,只会在用户点“取消”时默默提交一次空数据。