必须在done回调里操作DOM,因为Layui表格异步渲染,table.render()执行后DOM未就绪,只有done触发时真实表格才插入文档流;需用$("#demo").find(".layui-table-main table")准确定位目标table;合并时须跳过表头、用res.data比对、设rowspan并隐藏重复td,且每次done中需先清除旧属性再重设。

为什么必须在 done 回调里操作 DOM
Layui 表格渲染是异步的,table.render() 执行后 DOM 并未就绪,直接查 td 或用 $("#id").find("td") 几乎必然查不到目标元素。只有 done 回调被触发时,真实数据表格才已插入文档流,此时操作 DOM 才安全。常见错误是把合并逻辑写在 render() 外部、或放在 success(AJAX 配置项)里——那只是数据拿到了,表格还没画出来。
怎么准确定位到要操作的 table 元素
Layui 动态表格会生成两层结构:外层是容器 div(如 layui-table-main),内层才是实际渲染数据的 <table>。用 $("#demo") 选中的是容器,不是表格本身,容易失效。
正确做法是限定父容器后向下找真正的 table:
-
$("#demo").find(".layui-table-main table")—— 最稳,适用于单表 -
$(".layui-table-main table").eq(0)—— 适合页面有多个 Layui 表格时按顺序取 - 避免用
$("table")全局匹配,极易误伤其他非 Layui 表格
合并逻辑里最容易错的三件事
合并不是简单设 rowspan 就完事,以下三点不注意,轻则样式错乱,重则整列消失:
- 起始行索引必须跳过表头:
tr遍历时从第 1 行开始(i = 1),否则会把表头也卷进去计算 - 比较值必须用原始数据,而非 DOM 文本:用
res.data[i].field === res.data[i-1].field,别用$td.text(),后者可能含空格、换行或模板渲染后的 HTML - 隐藏重复单元格必须用
display: none,不能用visibility: hidden或删掉节点——前者保留占位导致错行,后者破坏表格结构引发边框断裂
分页切换后合并失效怎么办
每次翻页、搜索、重载都会重新触发 done 回调,所以合并函数必须能反复执行且不累积副作用。关键点在于:
- 每次执行前先清除旧的
rowspan和display: none,比如用$table.find("td[rowspan]").removeAttr("rowspan") - 不要依赖全局变量存“上一次合并位置”,而是每次都从头遍历当前页的
tr - 如果用了自定义
templet渲染字段,确保该字段在res.data中存在且可比对,否则合并依据会为空
真正麻烦的不是第一次合并,而是数据动态更新后你还得记得清旧设新——这点很容易被忽略,结果就是翻两页后发现合并全乱了。


















