colToggled 事件仅响应列显隐切换,不处理搜索筛选;layui 表格无「表头筛选」内置事件,filter: true 仅渲染漏斗图标,筛选逻辑需手动实现。

colToggled 事件只响应列显隐切换,不是搜索筛选
layui 表格没有叫「表头筛选」的内置事件——你点列右上角的筛选图标(漏斗图标),触发的是列显示/隐藏行为,对应 colToggled 事件,不是按内容搜索或下拉选值那种业务筛选。
常见错误现象:在控制台监听 table.on('filter(test)', ...) 或 table.on('search(test)', ...),结果完全没反应。因为 layui 原生不提供这类事件名。
- 真正生效的是
colToggled(Layui ≥ 2.8),它在用户点击列右上角「显示/隐藏该列」时触发 - 该事件回调参数
obj包含:obj.field(列字段名)、obj.show(布尔值,true 表示刚被显示) - 它不携带任何筛选条件(如关键词、下拉选项值),也不管你有没有配
filter: true - 如果你启用了
cols中某列的filter: true,那只是渲染出一个漏斗图标,点击后弹窗、输入、确认等交互完全由你自行实现
filter: true 列的点击动作必须手动绑定
当你配置了 {field: 'status', title: '状态', filter: true},layui 只加了一个带 lay-event="filter" 的漏斗图标 DOM,其余全是空的。要让它真能筛选,得自己写点击逻辑。
- 绑定时机必须在
table.render()的done回调里,否则th[data-field="status"] .layui-table-filter还没生成 - 推荐用事件委托:
$(document).on('click', 'th[data-field="status"] .layui-table-filter', function() {...}) - 别直接给图标加
onclick属性——表格重载(table.reload())后会失效 - 点击后通常要弹 layer.open() 自定义筛选面板,而不是依赖 layui 内置组件(它没提供可复用的筛选 UI)
- 筛选确认后,你需要调用
table.reload()并传入where参数,把筛选条件透传给后端接口
想监听「用户输完关键词按回车」?得接管 input 事件
如果自定义筛选面板里放了 <input type="text">,想监听用户输入并实时过滤(非提交后 reload),就不能靠表格事件,得直接监听那个 input。
- 不要写
$('input.filter-input').on('input', ...)—— reload 后 DOM 被替换,事件丢失 - 必须用委托:
$(document).on('input', '.filter-input', ...)或更精准地限定父容器(比如 panel 的 id) - 注意防抖:用户快速连敲时,别每键都 reload,用
setTimeout+clearTimeout控制频率 - 前端过滤(data 模式)可用
table.cache['your-id']遍历比对,但要注意分页逻辑——table.reload({ data: filteredData })会丢掉原分页配置 - 服务端过滤(url 模式)更稳妥:
table.reload({ where: { status: val } }),让后端返回新数据并重置当前页码
容易忽略的兼容细节
不同版本的 layui 对 filter 图标 DOM 结构有差异,硬写选择器容易断。2.8+ 的结构相对稳定,但仍有坑:
-
th[data-field="xxx"]是唯一可靠锚点,不要依赖 class 名如.layui-table-filter(低版本可能叫.layui-table-sort) - 如果列被拖拽过位置,
th:nth-child(n)完全不可靠,必须认data-field - 固定列(
fixed: 'left')会导致表头 DOM 分离到两个容器(.layui-table-header和.layui-table-fixed-l),需分别绑定 - 调用
form.render()不影响 filter 图标,但如果你在筛选面板里用了 layui 表单元素(如 select),记得 reload 后再 render - 移动端点击漏斗图标可能被误判为列排序,可在点击 handler 里加
e.stopPropagation()防止冒泡到th的 sort 事件


















