Layui table 本身不支持单元格内搜索,需手动实现:用 table.cache 遍历数据匹配关键词,templet 动态高亮内容,配合防抖 reload 并注意正则转义与分页范围。

layui table 本身不支持单元格内搜索,得自己加逻辑
layui 的 table.render() 没有内置“在某列单元格中高亮/过滤关键词”的能力。所谓“单元格内搜索”,实际是两件事:一是用户输入关键词后,定位到匹配的行(甚至单元格),二是视觉上突出显示匹配内容——这得靠前端手动实现,不能依赖 table 自带功能。
用 table.cache 遍历数据做关键词匹配最直接
table.cache 是 layui table 渲染后缓存的原始数据数组(按页或全部,取决于是否开启分页及配置),它是实现搜索的可靠数据源。别去操作 DOM 表格行,容易错位、漏项或受分页干扰。
- 如果启用了分页,
table.cache['yourTableId']默认只存当前页数据;需要全局搜索就得先用table.getData('yourTableId')拿全量(注意性能) - 匹配时建议忽略大小写:
String(row[key]).toLowerCase().includes(keyword.toLowerCase()) - 匹配成功后,记录行索引(
rowIndex)或唯一 ID(需你数据里有),再调用table.selectRow(rowIndex)或手动加 class 高亮对应<tr> - 不要用
table.reload()做搜索重载——那会清空当前页码、排序等状态,体验断层
高亮单元格内容要用 templet 动态包裹关键词
单纯给整行加背景色不够精准,“单元格内搜索”通常意味着在文本中标出关键词。必须在列定义里用 templet 函数处理字段值,把关键词替换成带 <span class="highlight"></span> 的 HTML。
templet: function(d) {
const keyword = $('#searchInput').val().trim();
if (!keyword) return d.title;
const escaped = keyword.replace(/[.*+?^${}()|[]\]/g, '\$&'); // 转义正则特殊字符
const reg = new RegExp('(' + escaped + ')', 'gi');
return d.title.replace(reg, '<span class="highlight">$1</span>');
}- 正则必须加
g(全局)和i(忽略大小写),否则只匹配第一个 - 用户输入
.、*等正则元字符会崩,务必先replace转义 - 不要在 templet 里直接操作 DOM 或发请求,它只负责返回字符串
- 配合 CSS:
.highlight { background-color: #ffeb3b; }
监听输入并触发重渲染,但别频繁 reload
搜索框 input 事件一触发就调用 table.render() 是常见错误。正确做法是:保留原始 table 配置对象,仅更新 cols 中涉及搜索的列的 templet,然后调用 table.reload() 并传入新列配置 —— 这样只刷新内容,不重初始化表格。
- 用防抖(debounce)控制触发频率,比如延迟 300ms 再执行,避免每敲一个字都跑一遍
-
reload()时传{ cols: newCols, done: function() { /* 重绘后可滚动到首个匹配行 */ } } - 如果数据量大(>5000 行),全量匹配会卡顿,考虑后端接口支持模糊搜索并分页返回结果
layui 的单元格搜索本质是“数据过滤 + 模板高亮 + 用户交互控制”,没有捷径。最容易被忽略的是正则转义和分页下 table.cache 的范围问题——搜不到内容,八成卡在这两处。


















