layui原生lay-search无空结果提示,需手动监听blur事件并插入带layui-select-empty类的提示项,同时补全css样式确保显示正常。

lay-search 下拉框搜不到结果时为什么没提示
Layui 原生 lay-search 不提供空结果钩子,也不会自动插入任何提示文案——它只做两件事:渲染搜索框、对 dd 元素做 display: none 过滤。用户输完词点开下拉,看到一片空白,根本分不清是“没数据”“加载失败”还是“还没响应”。这不是 bug,是设计如此。
必须手动监听 blur + 判断匹配状态
核心逻辑是在用户输完失焦时,检查当前输入值是否与任一 dd 的文本完全匹配。不匹配就动态加提示项(不是按钮,是纯文字提示):
- 监听
body上的blur事件,目标为'.layui-select-title input'(避免动态 input 绑定失效) - 通过
$(e.currentTarget).closest('.layui-form-select')找到当前下拉容器 - 用
.find('.layui-anim-upbit dd')获取所有可选项(注意排除带layui-select-tips的默认占位项) - 遍历
dd,用$(dd).text().trim() === inputValue判断是否已存在;若全不匹配,则插入:<dd class="layui-select-empty">未找到匹配项</dd> - 每次插入前,先移除旧提示:
.find('.layui-select-empty').remove()
插入的提示项为什么点不了、样式不对
因为 Layui 的下拉弹层(.layui-anim-upbit)是每次点击才动态生成的,你插进去的 dd 没被 Layui 初始化过,不会响应 hover、点击,也没有默认字体/行高。解决办法很简单:
- 给提示
dd加class="layui-select-empty",并在 CSS 中补上基础样式:.layui-select-empty { color: #999; padding: 0 15px; line-height: 38px; cursor: default; } - 不要给它加
lay-value或任何交互属性,它只是视觉提示,不该被选中 - 如果用了自定义 skin,检查是否覆盖了
.layui-anim-upbit dd的display或overflow,导致提示被裁掉
动态加载数据后提示不生效
常见于联动场景:上级 select 改变 → 请求接口 → 清空并重填下级 select → 调 form.render('select')。此时新插入的 option 会生成新的 dd,但你的 blur 监听器没重绑,或旧提示没清理干净。
- 每次
form.render('select')后,确保 blur 监听逻辑仍有效(推荐用事件委托绑定到document) - 在清空下拉前,执行
$('.layui-select-empty').remove(),避免残留 - 如果下级
select是异步加载的,blur 监听器必须等 DOM 就绪后再挂载,不能写死在页面初始化里
.layui-anim-upbit 这个临时容器的生命周期 —— 它每次展开都重建,你插进去的东西,下次展开就没了,得次次重来。











