必须在 table.render 的 done 回调中动态插入自定义 select 并绑定事件,因 Layui 工具栏不解析 HTML 字符串;需用 layui.$ 清理旧元素、追加新 select、调用 form.render('select') 启用美化样式,并通过 form.on 绑定事件。
表格工具栏里加自定义 select 不能靠 toolbar 模板字符串硬写
直接在 toolbar 配置项里写 html 字符串(比如 '<select><option>导出</option></select>')看似简单,但实际会失效——layui 的表格工具栏只解析内置图标和按钮指令(如 {% raw %}{{# layui_toolbar_export }}{% endraw %}),不执行 html 渲染或事件绑定。你写的 select 标签会被当作文本原样输出,甚至可能被转义成乱码。
真正可行的路径是:用空的 toolbar 占位,等表格渲染完成后再手动插入 DOM,并自己绑定事件和数据。
- 必须等
table.render()的done回调触发后操作,此时.layui-table-tool .layui-table-tool-self容器已存在 - 插入节点推荐用
layui.$(不是原生document.createElement),保证与 Layui 内部 jQuery 版本兼容 - 避免重复插入:每次重载表格前先
layui.$('.my-custom-select').remove()
用 layui.$ 动态追加 select 并绑定 change 事件
在 done 回调里操作最稳妥。注意下拉框要加 class 便于后续清理,且 change 事件必须委托或重新绑定(因为表格重载会销毁旧 DOM)。
table.render({
elem: '#demo',
url: '/api/list',
toolbar: '#toolbarDemo', // 空模板或留空
done: function(res, curr, count) {
var $toolSelf = layui.$('.layui-table-tool .layui-table-tool-self');
// 先清理已有自定义 select,防止翻页/重载重复
layui.$('.my-custom-select').remove();
<pre class='brush:php;toolbar:false;'>var $select = layui.$('<select class="my-custom-select"><option value="">筛选类型</option><option value="1">已审核</option><option value="2">待处理</option></select>');
$toolSelf.append($select);
// change 事件必须在 append 后立即绑定(不能依赖 document.on)
$select.on('change', function() {
var val = layui.$(this).val();
console.log('选中值:', val);
// 这里可触发 reload 或自定义逻辑
table.reload('demo', {
where: { status: val }
});
});} });
如果要用 Layui 的 form.select 样式,得手动 form.render()
上面示例里的原生 select 是纯 HTML,没样式也没下拉动画。若想用 Layui 默认的美化下拉,得走 Form 模块流程:
- 插入时用带
lay-filter的select,例如<select lay-filter="table-status-filter"> - 插入后立刻调用
form.render('select'),否则不会生效 - 监听需改用
form.on('select(table-status-filter)', callback),而非原生change - 注意:多次
form.render()不报错但可能影响性能,建议只在首次插入或必要时调用
表格重载时下拉框消失?关键在 done 和清理时机
很多人发现翻页或搜索后 select 没了,是因为只在初始 render 时插入,没覆盖所有重载场景。Layui 表格的 reload、page、sort 都会再次触发 done,所以清理 + 插入逻辑必须放在 done 里,而不是 render 外部。
另一个易错点:用 table.on('toolbar(demo)', ...) 监听工具栏点击,但这个监听只对内置按钮有效,对动态插入的 select 无效——它根本不在 toolbar 事件流里。务必用独立的 change 或 form.on 绑定。
复杂点在于 DOM 生命周期和事件管理权交叠,Layui 不暴露工具栏容器的钩子,只能靠人工盯住 done 和清理节奏。漏掉一次 remove,就可能在多页切换后看到两个一模一样的下拉框。


















