layui table需手动实现行点击高亮:在done回调中委托绑定tbody的tr点击事件,阻止冒泡并排除操作列,通过data-index从table.cache获取准确行数据,配合!important高亮样式覆盖默认效果。

layui table 默认不支持行点击高亮,需手动绑定事件
layui 的 table.render() 渲染后表格本身没有内置「点击行高亮」或「单选行」逻辑,row 选中状态完全靠自己维护。直接依赖 lay-checked 类或 checkbox 列是走偏了——那只是复选框行为,和纯点击行无关。
核心思路:监听 tr 点击 → 移除之前高亮的 tr → 给当前 tr 加自定义类(如 layui-table-clicked)→ 同步记录当前选中行数据。
注意:必须在 done 回调里绑定事件,否则 DOM 还没渲染完就绑不上;且要防重复绑定,建议用 once 或先解绑再绑。
给 tr 绑点击事件时,别忘了阻止事件冒泡到 table 外层
layui 表格的 tr 内部有 td、图标、按钮等,如果点击的是带 lay-event 的操作列按钮,又没阻止冒泡,会导致「按钮动作 + 行高亮」同时触发,体验错乱。
实操建议:
- 用
$('tbody').on('click', 'tr', function(e) { ... })委托绑定,比遍历每个tr更安全 - 在事件处理函数开头加
e.stopPropagation() - 用
$(e.target).closest('td[lay-event]')判断是否点在操作列上,是则直接 return - 避免对整个
table绑click,否则会误触表头、分页栏等区域
高亮样式要覆盖 layui 默认 hover 和选中色
layui 自带 .layui-table-hover 和 checkbox 选中时的背景色,如果不加 !important 或提高 CSS 优先级,自定义高亮会被覆盖。
推荐写法(放在页面 <style> 或外链 CSS 中):
.layui-table tbody tr.layui-table-clicked > td {
background-color: #e6f7ff !important;
color: #1890ff;
}
/* 如果用了隔行变色,还需单独重置偶数行 */
.layui-table tbody tr.layui-table-clicked:nth-child(even) > td {
background-color: #d9f2ff !important;
}别漏掉 nth-child(even) 场景——否则偶数行高亮后颜色变淡甚至看不出来。
获取点击行数据不能只靠 $(this).data(),要用 table.cache
渲染表格时,layui 把原始数据存在 table.cache['yourId'] 里,而 DOM 上的 tr 只存了 data-index(从 0 开始的序号),不是原始数组下标。如果表格启用了排序、搜索、分页,DOM 顺序和 cache 顺序就不一致了。
正确做法:
- 从
tr取data-index:const index = $(this).data('index') - 查
table.cache:const cacheData = table.cache['yourTableId'] || [] - 用
index取数据:const rowData = cacheData[index] - 别用
$(this).find('td').eq(0).text()拼数据——字段可能被格式化、隐藏、合并,不可靠
这个细节最容易被忽略:分页后点第 2 页某行,data-index 是当页内的序号(比如 2),但 cache 里对应的是全量数据的第 2 条,而非第 2 页的第 2 条——其实 layui 的 data-index 就是全量缓存索引,不用换算。


















