应选用 xm-select 实现复选框下拉,因其原生支持 showcheckbox: true 模式,自动渲染复选框、支持树形联动与禁用态;而 formselects 无真实复选框 ui,强行模拟易引发兼容与交互问题。

直接用 xm-select,它原生支持复选框样式下拉列表,不依赖 jQuery,和 Layui 2.x(2.5.0–2.8.x)共存无冲突,改一行 HTML 就能启用。
为什么不用 formSelects 做复选框下拉?
formSelects 默认渲染的是标签式已选项 + 下拉菜单,内部用的是自定义悬浮面板,选项本身没有复选框 UI 元素;它虽支持多选,但视觉上是“点击即选、标签回显”,不是带勾选框的 checkbox 列表。如果你明确需要每个选项左侧显示 ✓ 或原生复选框控件,formSelects 的默认行为不符合预期——强行 CSS 模拟 checkbox 容易破坏搜索、分组、禁用态等逻辑,且移动端点击热区错位风险高。
xm-select 如何开启复选框模式?
只需在初始化时传入 showCheckbox: true 参数,它会自动为每个选项渲染带复选框的列表,并同步管理选中状态、半选(用于树形结构)、禁用项灰显等。
-
showCheckbox设为true后,选项左侧出现复选框,支持鼠标/触屏点击触发 - 配合
tree: true可实现带层级的复选框树(比如权限模块→子功能),自动处理父子联动 - 若数据含
disabled: true字段,对应复选框自动置灰不可点 - 搜索时复选框状态保持不变,过滤后仍可继续操作
容易踩的坑:Layui 表单校验与 xm-select 冲突
Layui 的 form.verify 不识别 xm-select 渲染后的 DOM 结构,它只监听原始 <select></select> 的 change 事件,但 xm-select 默认不触发原生事件(为避免重复触发)。必须手动调用 el.change() 或配置 bind: 'change':
var demo1 = xmSelect.render({
el: '#demo1',
showCheckbox: true,
data: [...],
bind: 'change' // 关键:让 xm-select 主动触发原生 change 事件
})
否则 form.val('formFilter') 读不到值,form.on('submit(...)') 里也拿不到选中数据。
性能注意点:大数据量下别开 showCheckbox + search + tree 三连
当选项超过 500 条、又同时启用 showCheckbox: true、search: true 和 tree: true 时,首次渲染可能卡顿(尤其 IE11 或低端安卓 WebView)。建议:
- 纯平级多选 → 关闭
tree,保留showCheckbox和search - 树形结构但选项不多(
- 超大数据源 → 改用远程搜索(
remote: {url: '/api/options'}),每次只拉当前关键词匹配的项
复选框渲染本身不重,真正拖慢的是 DOM 批量插入 + 事件绑定 + 拼音索引构建,这三点叠加才容易出问题。











