done回调中focus失效是因为搜索框DOM异步挂载晚于done触发,需用queueMicrotask延迟执行并判断元素存在性;自定义toolbar时须用id或唯一class精准定位。
直接在 table.render() 的 done 回调里调 .focus() 会失败,因为搜索框 dom 尚未插入完成。必须用微任务延迟执行,并加存在性判断。
为什么 done 里 document.querySelector('.layui-table-search-input').focus() 常常无效
Layui 的 done 回调只保证表格主体(<tbody>)已渲染完毕,但默认工具栏(含搜索框)是异步挂载的,时间点略晚于 done 触发时刻。此时查到的元素为 null,或虽存在却尚未可聚焦——不是代码写错,而是时机不对。
正确做法:queueMicrotask + 精准选择器 + 存在性判断
用 queueMicrotask 把聚焦逻辑推到当前宏任务末尾、DOM 插入完成后执行,比 setTimeout(..., 0) 更精准可靠。
- 优先使用
.layui-table-search-input类名(Layui v2.8+ 标准) - 若用自定义
toolbar,需自己写<input id="my-search">或加唯一 class,不能依赖 Layui 内部类 - 务必先
querySelector,再判空后调.focus(),避免控制台报错中断后续逻辑
layui.table.render({
elem: '#demo',
url: '/api/list',
cols: [[{field: 'id', title: 'ID'}]],
defaultToolbar: ['search'],
done: function(res, curr, count){
queueMicrotask(() => {
const input = document.querySelector('.layui-table-search-input');
if(input) input.focus();
});
}
});
自定义 toolbar 时怎么定位搜索框
一旦你写了 toolbar: '<div><input type="text" id="my-search" class="layui-input"></div>',Layui 就不再自动加 .layui-table-search-input。此时必须靠你写的标识符来查。
- 推荐用
id,如document.getElementById('my-search') - 若用 class,请确保全局唯一,比如
class="my-table-search",然后查document.querySelector('.my-table-search') - 同样要套在
queueMicrotask里,且做判空
微任务延迟这一步容易被跳过,尤其在快速迭代时;而搜索框是否真被聚焦,又很难肉眼验证——它只闪一下光标,不报错也不提示,所以这个细节必须写死在模板里,否则每次都要重踩一遍。


















