Layui select 必须嵌套在 class="layui-form" 的容器内才能渲染,否则即使调用 form.render('select') 也无效;动态插入需确保容器含该 class 并立即 render;监听需用 lay-filter 和 form.on;异步内容中须在 DOM 就绪后显式 layui.use('form')。

layui select 必须套在 layui-form 容器里,哪怕没有 form 标签
不是“能不能用”,而是“不套就根本不会渲染”。Layui 的 form.render('select') 只扫描带有 layui-form class 的父容器下的 select 元素。如果你直接写:<select name="city"><option>北京</option></select>,哪怕后面调了 form.render('select'),也只会静默失败——没报错,但下拉框还是原生样式。
正确做法是用任意块级元素包裹,比如:<div class="layui-form"><select name="city"><option>北京</option></select></div>
这个 div 可以是 section、aside,甚至一个空的 span(但需设 display: block),关键是 class 不能少。
动态插入的 select 必须插进 layui-form 内,且立刻 render
常见错误:AJAX 拿到 HTML 片段后,直接 $('#container').html(html),结果下拉框点不开。原因有二:
- 片段里漏了
class="layui-form"父容器 - 插入后没调
form.render('select'),Layui 不会自动感知 DOM 变化
实操建议:
- 确保返回的 HTML 包含外层容器,例如:
<div class="layui-form"><select name="type">...</select></div> - 插入后立即执行:
layui.use('form', function(){ var form = layui.form; form.render('select'); }); - 如果容器有 ID(如
id="filter-box"),可限定范围提升性能:form.render('select', 'filter-box')
非表单场景下监听 select 值变化,别依赖原生 change 事件
渲染后的 select 已被隐藏,原生 change 事件基本不触发。必须用 Layui 的事件机制:
- 给
select加lay-filter="xxx"属性(哪怕只是占位) - 用
form.on('select(xxx)', callback)监听,callback中的data.value才是真实选中值 - 注意:回调里的
this是原生select元素,data.elem是渲染后的 DOM 节点
如果只是想取当前值(比如点击按钮时),不要用 $('select').val() —— 它可能还是旧值。应优先用:layui.$('select[name="xxx"]').val() 或直接读 data.field.xxx(若在 form submit 回调中)。
弹窗、Tab 页等异步内容里的 select 渲染失败,常因模块未加载
layer 弹窗、tabs 切换后动态加载的内容,DOM 存在了,但 layui.form 模块可能还没初始化。这时候 form.render() 会报 form is not defined。
必须显式 layui.use('form', ...),且确保在内容插入完成后再执行:
- layer.open 的
success回调里调用layui.use - tabs 的
tabChange回调中,等新面板 DOM ready 后再layui.use - 避免把
form.render()写在全局 script 里——那时弹窗 DOM 还不存在
真正容易被忽略的是:render 前要确认 select 已挂载到 DOM,且父容器带 layui-form;render 后要确认 form 实例已就绪。这两步缺一不可。


















