layui table 行点击事件须用 table.on('row(tabledemo)', fn) 绑定,其中 tabledemo 为初始化时配置的 id;子表应插在目标 tr 后紧邻位置,class="layui-table-expand-row",td 设 colspan;展开状态需手动缓存并同步。
layui table 的 rowclick 事件怎么绑定才有效
默认情况下 layui.table 不会触发行点击的原生事件,必须在渲染后通过 on('row') 或 on('rowDouble') 手动监听。直接给 tr 绑 click 会失效——因为表格是动态渲染的,且存在分页、重载等场景,DOM 可能被反复销毁重建。
- 必须用
table.on('row(tableDemo)', function(obj){...}),其中tableDemo是你初始化时传的id值(不是元素 ID,是elem对应的配置项id) - 如果没设
id,就无法监听行事件;别漏写这个配置 - 不要在
done回调里用$('tr').on('click', ...),这种绑定只对当前页生效,翻页后失效
展开子表该插在哪?tr 后面还是 tbody 里
子表不能插在 tr 内部(比如 <td colspan="*">...</td>),否则会破坏表格结构,导致 layui 自动计算列宽错乱、固定列错位、甚至报错 "Cannot read property 'children' of undefined"。
- 正确做法:在目标
tr后面紧接插入一个新tr,class="layui-table-expand-row"(自定义类名即可),里面套一个td,colspan设为原表格列数 - 用
obj.tr.after(...)插入,而不是append或before——obj.tr是当前点击行的 jQuery 对象,保证位置准确 - 注意:如果用了
fixed: true(固定列),子表必须同时在左、中、右三个tbody中分别插入对应结构,否则视觉错位
子表用 table.render 还是手写 HTML
子表如果只是静态展示或简单数据,手写 <table><tr><td>...</td></tr></table> 更轻量、可控;但如果要排序、分页、工具栏或和父表联动,就必须用 table.render,但要注意生命周期。
- 每次展开前先检查是否已渲染过,避免重复初始化:
if (layui.table.get('subTableId')) { layui.table.reload('subTableId', {...}) } - 子表的
elem必须是唯一 ID,且不能是父表容器内部的静态 DOM(比如#subTable1),而应是动态生成的临时容器,例如<div id="subTable_<code>obj.data.id">











