jquery事件丢失是因为table.reload()重建dom导致原绑定失效,必须用事件委托绑定到稳定父容器如#usertable,并指定目标选择器button.edit-btn,避免在done回调重复绑定。
reload后jquery事件丢失是因为dom被重建
table.reload() 会清空整个 <tbody> 并重新生成所有 <code><tr><code><td>,原来用 <code>$('button').on('click', ...) 绑定的事件监听器全部失效——不是“没触发”,是那个 button 元素早被删了,新的是全新节点。
必须用事件委托(delegate)代替直接绑定
把事件监听挂到不会被 reload 删除的父容器上,比如表格容器 #userTable 或 .layui-table-box,再指定目标选择器。否则每次 reload 后都得手动重绑,极易遗漏或错位。
- 错误写法(reload 后失效):
$("button.edit-btn").on("click", handler) - 正确写法(持久生效):
$("#userTable").on("click", "button.edit-btn", handler) - 如果表格在 iframe 里,委托目标要选 iframe 内的稳定父级,不能选
document(可能跨域或时机不对) - 避免用
$(document).on(...),它虽能捕获,但事件冒泡路径长、性能略差,且容易和其它模块冲突
done 回调里不能直接绑事件,要检查是否已存在
有人习惯在 done 回调里重新执行 $("button").on(...),这看似能补救,但有隐患:多次 reload 就会重复绑定,一次点击触发多次 handler;而且如果用户快速点击搜索按钮触发并发 reload,done 可能交错执行,导致事件叠加。
- 要么坚持用委托(推荐)
- 要么在
done中先解绑再绑:$("#userTable").off("click", "button.edit-btn").on("click", "button.edit-btn", handler) - 或者加个标记,只在首次渲染时绑定:
if (!$("#userTable").data("events-bound")) { /* 绑定 + data("events-bound", true) */ }
自定义操作列模板里要确保元素有稳定 class 或 data 属性
如果你用 templet 渲染按钮,比如 <button class="layui-btn layui-btn-xs del-btn" data-id="{{d.id}}">删除</button>,那委托才能精准命中。别用动态拼接的 class 名,也别依赖 index 或行内 style 做判断——这些 reload 后不可靠。
jQuery 1.12.4是jQuery 1.x系列的最后一个正式稳定版本,由jQuery团队于2016年发布。该版本主要面向需要兼容旧版浏览器环境的网站和Web应用,尤其适用于仍需支持Internet Explorer 6、Internet Explorer 7、Internet Explorer 8等老旧浏览器的项目。
- 必须给可交互元素设固定、语义清晰的 class,如
edit-btn、del-btn - 需要传参时优先用
data-*属性(如data-id="{{d.id}}"),而不是从 DOM 树向上找tr再取LAY_INDEX - 如果用了
lay-event,注意它本质也是靠委托实现的,但仅限于table.on('tool(...)'),不适用于你自己的非工具栏按钮
关键点在于:Layui 的 reload 是 DOM 级别的销毁重建,不是数据层更新。任何依赖原始节点的绑定都会断,唯一稳住的方式,是把监听器挂在“活”着的祖先节点上,并用稳定的选择器定位目标。别指望 done 里补绑能一劳永逸——它只是权宜,委托才是正解。










