layui的select组件隐藏原生select但未销毁,可通过id或lay-filter用原生dom方法获取;form.on('select')回调中this即为原生select元素,可直接读写value、调用focus()等。

layui下拉框的 select 元素本身被隐藏了
layui 的 select 组件(即 layui.form.select)在初始化后,会把原始 <select></select> 标签设为 display: none,并用自定义 DOM(如 <div class="layui-select-title">)模拟下拉交互。所以直接用 <code>document.getElementById 或 querySelector 拿到的只是被隐藏的原生 select 元素,不是“当前展示的选中项 DOM”——但你要的其实是这个原生 select 本身,而不是它的伪元素。
通过 lay-filter 或 id 定位原始 select 节点
layui 不会销毁原始 select,只是藏起来。只要你在 HTML 中写了 id 或 lay-filter,就能反向定位它:
- 如果原始
<select id="mySelect"></select>,就用document.getElementById('mySelect') - 如果用了
lay-filter="cityFilter",可用document.querySelector('select[lay-filter="cityFilter"]') - 注意:不要用
layui.$('select[lay-filter=...]'),因为 layui 的 $ 是 jQuery 封装,而你只需要原生 DOM
监听 change 时拿到原生 select 实例
layui 的 form.on('select(filterName)', callback) 回调中,this 指向的就是当前触发事件的原始 select 元素(不是 jQuery 对象,是原生 DOM):
form.on('select(cityFilter)', function(data){
console.log(this); // <select lay-filter="cityFilter">...</select>,原生 DOM
console.log(this.value); // 当前选中 option 的 value 值
console.log(this.options[this.selectedIndex]); // 当前选中的 option DOM 节点
});
- 这个
this就是你能直接操作的原生select对象,可读属性、调用focus()、甚至dispatchEvent(new Event('change')) - 别误以为
data.elem是原生 DOM——它其实是 layui 渲染出的外层容器<div class="layui-form-select">,不能当 <code>select用手动触发或取值时避免混淆渲染层和原生层
常见错误是试图从 layui 渲染出的
.layui-select-title里找 value,或者用layui.$(...).val()取值——这依赖 jQuery 插件逻辑,且不一定同步原生状态:- 要取当前真实选中值,优先用
原生SelectEl.value或原生SelectEl.options[原生SelectEl.selectedIndex] - 要设置选中项,直接改
原生SelectEl.value = 'xxx',再调用form.render('select')同步 UI - 如果页面有多个同名
lay-filter,document.querySelector只拿第一个,需用querySelectorAll+ 遍历判断
原生
select始终是单点信源,layui 的 UI 层只是它的视觉代理;绕过它去操作渲染 DOM,迟早遇到状态不同步的问题。 - 要取当前真实选中值,优先用











