Layui复选框超限限制需同步DOM与内部状态:普通表单用form.render('checkbox')重绘,表格必须用obj.del();禁用多余选项更友好,且table.checkStatus()后须手动过滤LAY_CHECKED有效项。

form.on('checkbox') 里直接判断已勾选数量是否超限
普通表单里的独立 ,用这个最轻量。核心是监听点击后立刻查当前已勾选数,超了就回滚状态并重绘 UI。
常见错误是只写 $(obj.elem).prop('checked', false),这改了 DOM 但 Layui 内部状态没同步,后续 form.val() 拿不到正确值。必须加 form.render('checkbox')。
-
$('input[name="like[]"]:checked').length统计最直观,注意name属性要一致(比如都带[]) - 别在判断里写
return false,它只阻止冒泡,不撤销 checkbox 状态 - 提示用户后一定要调
form.render('checkbox'),否则 UI 显示勾上了,实际没生效 - 如果用了自定义 class(如
class="my-checkbox"),建议用$('.my-checkbox:checked').length避免name冲突
table.on('checkbox') 中用 obj.del() 撤销超限勾选
Layui 表格的复选框是模拟渲染的,DOM 上的 checked 属性始终为 false,不能靠 jQuery 操作。必须用 Layui 提供的 obj.del() 方法,它会同时更新内部状态和 UI。
常见错误是拿 obj.checked === true 就认为“这次是勾选”,但全选时 obj.data 是 undefined,且单行勾选/取消都触发同一事件——所以得先调 table.checkStatus('id') 查当前已选总数,再决定是否拦截。
- 检查逻辑必须放在回调函数最开头,状态一旦变更,
obj.del()就来不及了 - 全选场景下,
obj.data为undefined,此时不能依赖它,要单独处理:遍历当前页所有行,统计还能勾几项 -
obj.del()不会触发二次checkbox事件,安全可靠;手动设elem.checked = false会导致表格内部状态错乱 - 如果启用了分页,
table.checkStatus()默认只返回当前页数据,跨页限制需自己维护全局 ID 数组
禁用多余选项比弹窗提示更友好
纯提示“最多选 3 项”容易让用户反复试错。进阶做法是:当已选满 3 项后,自动禁用所有未勾选的 checkbox,视觉上灰掉,用户点不了,也无需提示。
对表格来说,就是遍历当前页所有行,给未勾选且非禁用行的 input[type="checkbox"] 加 disabled 属性,并补上 layui-form-checkbox[disabled] 样式类。记得每次勾选/取消后都重新跑一遍这个逻辑。
- 禁用操作必须配合
table.render('checkbox')或手动触发重绘,否则样式不更新 - 别用
pointer-events: none替代disabled:键盘 Space 键仍可切换、无障碍支持差、checkStatus结果错误 - 禁用只是 UI 层遮蔽,Layui 状态管理完全 unaware,后续仍要靠
table.checkStatus()+ 手动过滤才能拿到真实已选数据
table.checkStatus() 后必须手动过滤有效选中项
无论你用哪种方式限制,table.checkStatus('demo').data 返回的结果都包含被禁用或超限后回滚的行。Layui 不会自动剔除它们。
真实可用的已勾选数据得自己筛:先取缓存 const cache = table.cache['demo'],再过滤 cache.filter(d => d.status !== 'closed' && d.LAY_CHECKED)。注意字段名是 LAY_CHECKED,不是 layChecked。
- 全选判断不能看
res.count,得比对validChecked.length === cache.filter(d => d.status !== 'closed').length - 导出或提交前不做过滤,禁用行就真被当有效数据发出去了
- 如果用了
checkStrictly: true,父子联动逻辑不受影响,但结果一样要过滤 - 监听
checkbox事件时,开头加if(obj.disabled) return,否则后续处理会把禁用行当成有效选中项参与计算
跨页限制和禁用行过滤是两个最容易被忽略的点,尤其在服务端分页场景下,UI 和业务逻辑很容易脱节。











