layui select 的 DOM 结构非原生,无法用 querySelectorAll('option') 获取选项;应直接读取隐藏的原始 select 元素的 options 属性,如 document.getElementById('mySelect').options,并用 Array.from 转换为数组提取 value、text 等属性。

layui select 的 DOM 结构不是原生 select,不能直接 querySelectorAll('option')
layui 的 select 渲染后会隐藏原始 <select> 元素,转而生成一套自定义 DOM(如 <dl class="layui-anim"> + 多个 <dd>),所以对原始 select 调用 querySelectorAll('option') 会返回空数组。
正确做法是操作 layui 渲染后的下拉列表 DOM,或回溯原始 select 元素本身:
- 若你初始化时用了
layui.use(['form'], ...),且表单已渲染,则原始select元素仍保留在 DOM 中(只是display: none),它的options属性仍是可用的 - 可直接用原生 JS 获取:
document.querySelector('#yourSelectId').options,返回的是HTMLOptionsCollection,转数组用[...options]或Array.from(options) - 不推荐用
layui.form.render()后再去查.layui-select-title + dl dd,因为dd是懒加载的(点击才渲染),未展开时 DOM 中没有dd节点
获取所有 option 的 value 和 text 的标准写法
最稳的方式是读原始 select 元素,不管 layui 是否渲染、是否展开:
const sel = document.getElementById('mySelect');
const options = Array.from(sel.options).map(opt => ({
value: opt.value,
text: opt.text,
disabled: opt.disabled,
selected: opt.selected
}));
console.log(options); // [{value: "1", text: "苹果", disabled: false, selected: true}, ...]
注意:opt.text 取的是显示文本(等价于 opt.innerText),不是 opt.innerHTML;如果 <option> 里有 HTML 标签,text 会自动转义为纯文本,这是预期行为。
如果要用 layui 的 form 模块监听或操作,别漏掉 form.on('select(...)')
layui 的 form.on('select(filter)', callback) 只在用户手动选择时触发,**不会告诉你所有选项,只告诉你当前选中的 value**。它本质是事件监听,不是数据查询接口。
所以不要试图靠这个事件“收集全部 option”——它做不到。你需要:
- 初始化时就从原始
select提前读好全部 option 数据,存在变量里(比如window.selectOptions = options) - 后续在
form.on('select(xxx)')回调里,用这个缓存数据做映射或校验 - 如果选项是动态加载的(如 AJAX 填充),务必在填充完原始
select后、调用form.render('select')前,先提取并保存最新 option 集合
常见坑:disabled 选项被忽略、空 value 被当成 undefined
原始 select.options 会包含 disabled 项,但 layui 渲染后的下拉菜单默认不显示它们——这容易让人误以为“没拿到”。其实数据还在,只是 UI 过滤了。
另外,如果 <option value="">请选择</option>,它的 opt.value 是空字符串 "",不是 undefined;判断时别写 if (opt.value),否则会跳过这个合法选项。
真正要过滤掉的,只有 opt.disabled === true 且你业务上确实不需要这些项的情况,这时再加条件:filter(opt => !opt.disabled)。
原始 select 元素始终是最可信的数据源,layui 不会篡改它内部的 options 集合,只控制展示逻辑。别绕远路去解析渲染后的 DOM 结构。


















