lay-search="false"必须显式书写,不可删除或留空,且须置于form.layui-form内并调用form.render('select')才生效;该属性仅禁用搜索框渲染,不影响底层过滤逻辑。

lay-search="false" 必须显式写,不能删或留空
直接删掉 lay-search 属性,或者写成 lay-search="",Layui(2.9.16+)都会当成 true 处理,搜索框照常渲染。真正生效的写法只有一种:lay-search="false"。
这个属性必须加在 <select></select> 标签上,且该 <select></select> 必须包裹在 form.layui-form 容器内,否则 Layui 根本不识别该属性。
- ✅ 正确:
<select name="city" lay-search="false"></select> - ❌ 错误:
<select name="city" lay-search></select>(等价于true) - ❌ 错误:
<select name="city" lay-search=""></select>(2.9.16+ 视为开启) - ❌ 错误:
<select name="city"></select>(没写 = 默认开启)
form.render('select') 不调用,禁用就无效
lay-search="false" 只是“告诉” Layui 别渲染搜索输入框,但它只在 form.render('select') 执行时读取一次。页面初始化后动态改属性、AJAX 插入的 <select></select>、或 JS 修改了属性但没刷新,都会导致 DOM 里看不到搜索框,但模拟下拉层里仍存在 <input class="layui-input">。
常见表现:开发者工具里看到 <select lay-search="false"></select>,但点击下拉后还是弹出带搜索框的面板。
- 初始化时加了
lay-search="false"→ 必须确保layui.use('form', ...)回调里执行了form.render('select') - JS 动态设置属性 → 先
$('select').attr('lay-search', 'false'),再form.render('select') - 表单是异步加载的(如 tab 切换后 append)→ 插入 DOM 后立刻调
form.render('select'),别等 onload
禁用搜索 ≠ 禁用过滤,数据仍可能被前端匹配
lay-search="false" 只控制搜索输入框是否渲染,它不干涉 Layui 内部对 <option></option> 的匹配逻辑。如果你用的是远程搜索(lay-select 模块),或自己绑了 input 事件做 filter,那禁用搜索框只是去掉了 UI 元素,背后逻辑还得手动关。
例如:你用 layui.laySelect 并配置了 search: true,此时 lay-search="false" 完全无效——因为那是另一套组件,不走原生 select 渲染流程。
- 原生
<select></select>+lay-search="false"→ 搜索框消失,键盘输入无响应(前提是没额外监听) - 用了
laySelect.render()→ 必须设search: false,lay-search属性被忽略 - 自己写了
$('.layui-form-select input').on('input', ...)→ 即使没搜索框,input 事件也可能被触发,得手动移除监听或加守卫
键盘输入仍可触发?检查是否残留 readonly 或事件监听
即使禁用了搜索框,用户仍可能通过键盘输入文字,原因通常是:
一、Layui 渲染出的模拟 <input> 被设了 readonly,但没清掉;二、你或第三方代码在别处监听了 input 或 keydown,并主动更新了下拉内容。
- 查 DOM:
$('.layui-form-select input')是否还存在?如果存在,说明lay-search="false"没生效或form.render()没跑 - 清 readonly:
$('.layui-form-select input').removeAttr('readonly')是常见 hack,但如果目标是“禁止输入”,这反而会打开输入通道 - 防意外触发:在
form.on('select(xxx)')开头加if ($(this.elem).closest('.layui-form-select').find('input').length) return;,快速拦截残留输入引发的误选
最易被忽略的一点:禁用搜索框后,很多人以为“彻底安全”,却忘了自己写的联动逻辑或全局 input 监听可能绕过这个开关。真实环境里,lay-search="false" 只是第一道门,后面还得看 JS 层有没有其他入口透进来。











