end回调是唯一覆盖所有关闭路径的时机,它在弹层DOM彻底移除后强制执行,用于兜底清理(如刷新表格、重置表单),不传参且不依赖用户操作类型,但不可用于依赖用户行为的逻辑。
end 回调是唯一覆盖所有关闭路径的时机
只要弹层 dom 被彻底移除,end 就会执行——不管用户点右上角 ×、按 esc、点遮罩层、调用 layer.close(index),还是点击确定/取消按钮。它不传参,也不管你是怎么关的,只保证“人走茶凉”之后才触发。
别指望 cancel 或 yes 替代它:前者只响应右上角 × 和遮罩点击(且默认会关窗),后者只响应确定按钮;而 end 是真正兜底的清理入口。
-
end里适合做 reload 表格、清空临时变量、重置表单状态、销毁定时器 - 不要在里面操作可能已销毁的 DOM 元素(比如弹层内部的
$("#form")) - 如果表格实例
tableIns是局部变量,end里拿不到——必须挂全局或用layui.setter缓存
end 里刷新表格的写法和常见失效原因
最常用场景就是关闭后刷新数据列表,但 tableIns.reload() 经常不生效,问题几乎都出在上下文或参数上。
- 先判断实例是否存在:
if (tableIns && typeof tableIns.reload === 'function') - 显式传
where: {},否则缓存可能让请求不发出去 - 加时间戳防缓存:
where: { t: Date.now() } - 后端返回必须含
data和count字段,否则 layui 表格解析失败,控制台会报错但不提示 - 如果用了
id参数初始化表格,可用table.get('your-id')动态取实例,避免全局变量污染
跨域 iframe 场景下 end 不能直接通信
当 content 是跨域 URL(比如 https://other.com/form.html),子页面无法调用 parent.parentCallback,但 end 本身仍能正常执行——只是你不能再指望子页主动传数据过来。
-
end里只能做父页可控的操作,比如刷新表格、重载当前页部分区域 - 若需子页回传数据,必须用
postMessage,且父页要在end之前就监听message事件并校验event.origin - 别在
end里再注册message监听器——那时 iframe 已销毁,收不到消息 - 子页发消息的时机必须早于
parent.layer.close(),否则消息可能丢失
容易被忽略的细节:end 不等于 “用户点了关闭”
end 只代表 DOM 销毁完成,不代表用户做了什么决定。比如你在 cancel 里 return false 阻止了关闭,end 就不会触发;但一旦真关了,end 就一定跑,哪怕中间 JS 报错也没关系——它是在 layer 内部 DOM 清理完成后强制调用的。
所以别在 end 里写依赖用户行为的逻辑(比如“如果用户点了取消就清空草稿”),那该放在 cancel 或 yes 里;end 只负责“关完了,接下来该干啥”。











