layui原生select不支持多选,需引入第三方formSelects-v4.js;初始化时必须带multiple属性和lay-filter,通过formSelects.on监听值变化,IE11需额外CSS修复删除按钮错位。
layui select 多选功能本身不支持,得换 layui.select 为 layui.formSelects
原生 layui.select 只支持单选,强行加 multiple 属性会失效,且没有标签删除交互。官方没提供多选下拉组件,社区方案里 formselects 是最稳定、适配 layui 2.x 的选择——它不是 layui 内置模块,需额外引入。
常见错误现象:select[multiple] 在 layui 中渲染后仍为单选;手动绑定 change 事件取不到多值;点击选项无高亮反馈。
- 必须从 Gitee 仓库 下载
formSelects-v4.js(注意版本号,v4 兼容 layui 2.8+) - 在
layui.use中声明依赖:['formSelects'],不能写成['formSelects-v4'] - HTML 中的
select必须带multiple属性和lay-filter,否则初始化失败
初始化 formSelects 时,searchType 和 placeholder 参数影响实际体验
searchType 控制搜索匹配逻辑,默认 0(模糊匹配),设为 1 才支持首字母精准搜索;placeholder 不是传给 select 标签的属性,而是初始化时通过配置项传入,否则下拉框顶部空着不显示提示文字。
使用场景:后台返回的是 id-name 结构数组,但需要按 name 搜索、提交 id 列表——这正是 formSelects 默认行为,无需额外转换。
formSelects.render('mySelect', {
searchType: 1,
placeholder: '请选择多个角色',
success: function(id, vals, elem) {
// vals 是 [{id: '1', name: '管理员'}, {id: '2', name: '编辑'}]
}
});
删除标签后,vals 数组不会自动触发 change 事件,需监听 on 回调
用户点 X 删除某个标签,DOM 上的 select 元素 value 值不变(仍是空字符串),所以原生 form.on('select(...)') 完全收不到通知。这是最容易踩的坑:以为表单提交前取 select.val() 就行,结果永远拿不到实时多选值。
- 必须用
formSelects.on('mySelect', callback)监听变化,callback的第二个参数才是当前选中项数组 - 如果要同步更新隐藏域或校验状态,别操作
select元素本身,直接处理回调里的vals - 性能注意:回调内避免频繁 DOM 操作,尤其在大数据量多选时
IE11 下 formSelects 标签删除按钮错位,需补一行 CSS
在 IE11 中,删除按钮(×)会偏移到标签右侧外边,甚至被截断。这不是 JS 错误,是 formSelects 内联样式未兼容老浏览器的 flex 行为。
兼容性影响:仅 IE11 出现,Chrome/Firefox/Edge 均正常;不影响功能,但视觉上让用户困惑是否能删。
解决方式很简单,在页面底部加一段 style:
<style>
.formSelects-labels .formSelects-label{display:inline-flex;}
.formSelects-labels .formSelects-label i{margin-left:6px;cursor:pointer;}
</style>
复杂点在于,这个组件的 DOM 结构是动态生成的,样式必须足够具体才能覆盖内联 style;而且如果项目用了 scoped CSS 或 shadow DOM,还得调整作用域。











