必须用 layer.open() 的 end 回调函数触发刷新,因其在弹层 dom 彻底移除、动画结束后执行,覆盖点×、esc、遮罩、layer.close()等所有关闭路径;yes/cancel 仅响应按钮点击,子页调 parent.location.reload() 会整页刷新丢状态且不触发点×场景。

必须用 layer.open() 的 end 回调函数触发刷新,这是唯一覆盖所有关闭路径(点 ×、按 Esc、点遮罩、调用 layer.close())且确保 DOM 彻底销毁后的可靠时机;其他方式如 yes、cancel 或子页面直接写 parent.location.reload() 要么漏触发,要么整页刷丢状态。
为什么只能靠 end 回调?
end 是 layer.open() 原生支持的配置项,它在弹层 DOM 移除、动画完全结束之后才执行。这意味着:
- 用户无论怎么关(右上角 ×、Esc、点击遮罩、主动 layer.close(index)),end 都会走
- 此时父页面上下文稳定,tableIns 实例可安全访问
- 不依赖子页面是否加载完成、是否定义了某个函数,不跨 iframe 权限校验
yes 和 cancel 只响应按钮点击;success 太早(iframe 内容刚挂载,JS 可能还没执行);layer.closeAll() 无法区分是哪个弹窗关了;子页面里写 parent.location.reload() 则根本不会随“点 ×”触发,且强制整页刷新。
end 里怎么安全调用 table.reload()?
直接写 tableIns.reload() 很容易报错,因为 tableIns 可能未定义、已被释放,或表格没设 id 导致 table.get('id') 失败。正确做法是:
- 确保父页面初始化表格时保存实例:var tableIns = table.render({ id: 'userTable', ... })
- 在 end 中加存在性判断:if (tableIns && typeof tableIns.reload === 'function')
- 显式传参避免缓存和分页错乱:tableIns.reload({ page: { curr: 1 }, where: { t: Date.now() } })
- 若表格没设 id,改用 table.reload(null, { ... })(需确保页面仅一个表格实例)
子页面提交成功后要不要自己触发刷新?
不推荐。子页面只负责通知关闭,刷新逻辑应全部收口到父页面 end 中:
- 子页面提交成功后,只调 parent.layer.close(parent.layer.getFrameIndex(window.name))
- 不要写 parent.tableIns.reload() 或 parent.refreshData() —— 一旦父页面没暴露该变量,脚本直接崩
- 更不要在子页面 onunload 或 setTimeout 里调用刷新,这些钩子在 iframe 场景下不可靠,尤其 Chrome 会延迟或跳过执行
- 如果需要带参数刷新(比如按当前筛选条件重载),应在父页面 end 里读取当前表单/URL 参数,而不是让子页面传值
真正容易被忽略的是:reload 本身不重走 render 初始化流程,所以 cols、elem 不会重新解析,但 done 回调仍有效。如果你发现刷新后列宽错乱或工具栏消失,大概率是 render 时漏写了某些配置,而不是 reload 没生效。











