lay-search 属性无效需同时满足三个硬条件:layui ≥ 2.9.16、select 必须嵌套在 form.layui-form 内、未手动禁用渲染;版本低于2.9.16仅支持布尔值,高版本才支持对象配置;远程搜索需用插件或 layui.select 模块替代。

lay-search 属性加了没反应?先看这三个硬条件
原生 lay-search 不是写了就生效,必须同时满足:Layui ≥ 2.9.16、<select></select> 套在 <form class="layui-form"></form> 内、没调用 form.render('select', 'filter') 时手动禁用渲染(比如传了 render: false)。缺一不可,否则输入框压根不出现,控制台也无报错。
常见掉坑点:
- 外层用了
<div class="layui-form"> —— 不行,必须是 <code><form></form>标签 - 动态插入的
<select></select>,漏掉form.render('select')或调太早(DOM 还没挂载完) - 用了定制主题 CSS,把
.layui-form-select .layui-input的display设成了none,输入框被隐藏了却以为“没加载” - 2.9.15 及更早:只认布尔值,
lay-search、lay-search=""、lay-search="true"等效,仅开启前缀匹配(String.prototype.startsWith) - 2.9.16+:支持对象配置,如
lay-search="{fuzzy: true, caseSensitive: false}";但旧版遇到这种写法会直接忽略,降级为简单搜索,不报错也不提示 - 若项目还在用 2.8.x,写成
lay-search="{}"会被当空字符串处理,实际等效于开启默认搜索 - 选项含 HTML(比如带图标或状态标签)→ 搜索逻辑崩,匹配错位
- 数据量超 200 条 → 页面卡顿,甚至假死
- 用了
templet自定义模板 →lay-search完全不工作 - 用社区成熟插件:
formSelects或lay-select,引入 JS/CSS 后,初始化时配url和search: true即可,自动处理防抖、loading、参数拼接 - 用官方
layui.select模块(非form.select):需手动layui.use('select'),用<div> 占位,通过 <code>request和parseData控制请求与解析逻辑想搜不到就手动加新项?blur 事件别绑错目标
原生
lay-search不提供“新增选项”能力,必须自己补逻辑。但真实 DOM 结构里,<select></select>被隐藏了,表层是<div class="layui-input">,所以: <ul> <li>不能给 <code><select></select>绑blur—— 它根本收不到事件 - 正确做法是代理到 body:
layui.$('body').on('blur', '.layui-input', function(e) { ... }) - 从触发元素往上找:
$(e.currentTarget).closest('.layui-form-select').prev('select')才能拿到原始<select></select> - 追加前必须去重:
$(select).find('option').filter(function() { return $(this).text().trim() === inputValue; }).length === 0 - 加完务必调
form.render('select'),否则新<option></option>不出现在下拉列表中
lay-search="{fuzzy: true}" 在低版本会静默失效
lay-search 的值写法和版本强绑定。2.9.16 是分水岭:
判断当前版本:打开浏览器控制台,执行 layui.v,确认输出 ≥ "2.9.16"。
远程搜索不能靠 lay-search,得换模块或插件
lay-search 是纯 DOM 级过滤,它不会发请求,也不理解 API 返回结构。只要选项来自后端接口,原生方案就失效:
替代方案有两类:
最易忽略的一点:如果页面有多个带 lay-search 的下拉框,且都走同一套 blur 处理逻辑,记得用 data-xxx 属性区分上下文,否则新增项可能错挂到别的 select 上。











