最常用且最可靠的获取方式是监听 layui.form.on('select(...)') 事件,直接使用回调参数 data.value;也可调用 form.val('filterName') 主动读取,前提是 select 设置了对应的 lay-filter 属性。

layui 下拉框 select 的 value 获取方式
直接调用 layui.form.on('select(...)') 事件监听时,data.value 就是当前选中的 value 值——这是最常用、最可靠的获取方式。别去手动查 DOM,也别用 $(...).val(),layui 的表单模块会自动同步值,手动操作容易拿错。
为什么 $('#xxx').val() 有时返回 undefined?
因为 layui 渲染后,原始 select 元素被隐藏,视觉上的下拉框其实是它生成的 .layui-select-title 和 .layui-select-mune 等伪元素。原生 DOM 的 value 属性不会实时更新,而 layui 内部通过 form.val() 维护状态。
- ✅ 正确做法:用
form.val('filterName')(需提前给select设lay-filter="filterName") - ❌ 错误做法:直接
document.getElementById('id').value或$('#id').val(),尤其在未触发 change 时可能滞后或为空 - ⚠️ 注意:
form.val()返回的是整个表单字段对象,要取具体 select 的值,得传 filter 名,不是元素 ID
form.on('select(xxx)') 回调里的 data 结构
回调参数 data 是一个对象,包含三个关键字段:elem(原始 select 元素)、value(当前选中项的 value)、othis(layui 封装的 jQuery 对象)。其中 data.value 可直接使用,无需额外解析。
form.on('select(city)', function(data){
console.log(data.value); // 直接输出选中的 value,比如 'shanghai'
console.log(data.elem); // 原始 select DOM 元素
});
- filter 名必须和
select标签的lay-filter属性一致 - 如果 select 没设
lay-filter,事件根本不会触发 - 多个 select 共用同一个 filter 时,
data.elem能帮你区分是哪个触发的
动态加载选项后如何获取最新 value?
用 layui.form.render('select') 重载 select 后,旧的事件绑定依然有效,但如果你是在渲染后立刻想读值,不能依赖 DOM 状态,得靠 form.val() 或监听新事件。
- 渲染后立即取值:用
form.val('yourFilter'),它读的是 layui 内部缓存的最新值 - 确保
form模块已加载:layui.use(['form'], function(){...}) - 避免在
$.ajax成功回调里直接$('#sel').val()—— 这时还没 render,DOM 还没更新,值一定不准
select 事件取 data.value,或用 form.val('filter') 主动读。其它绕路方法要么失效,要么时序难控。真正容易被忽略的是 filter 名匹配和 render 后的值同步时机。


















