必须用 form.on('checkbox(filterName)') 监听全选事件,且 lay-filter 值须与 HTML 中严格一致;操作 checkbox 时用原生 checked 属性赋值并确保 form.render('checkbox') 调用,提交时 AJAX 需设 traditional: true。
全选事件必须用 form.on('checkbox(filterName)') 监听
直接给全选框绑 click 事件会失效——layui 渲染后 dom 状态和 ui 不同步,data.elem.checked 拿不到真实值,form.render('checkbox') 也不会自动触发。必须在 layui.use(['form'], function() { ... }) 回调里注册监听,且 lay-filter 值要和 form.on 参数严格一致(大小写、空格都不能错)。
常见错误:
-
<input type="checkbox" lay-filter="selectAll">写对了,但 JS 里写成form.on('checkbox(selectall)') - 提前声明
var form = layui.form,没等layui.use加载完成就调用
子项 checkbox 定位要用 name 或 class,别全局查
用 $('input[type="checkbox"]') 容易误操作,尤其页面有多个复选框区域(如权限配置区 + 用户列表区)时,一动全崩。
推荐做法:
- 按
name区分:input[name="userIds[]"]对应用户列表,input[name="perms[]"]对应权限项 - 加统一
class:class="user-check",再用$('.user-check')精准定位 - 表格场景下更稳妥:
$(data.elem).closest('table').find('tbody input[type="checkbox"]'),避免跨表干扰
操作 checked 属性要用原生 item.checked = true/false
别用 .prop('checked', true)——它只改属性,不触发浏览器原生状态变更,Layui UI 不刷新,后续 form.val() 或 data.field 会漏掉这些项。
反选逻辑也一样:逐个取反,不是先全清再全设。正确写法是:
$('.child-checkbox').each(function(item) {
item.checked = !item.checked;
});
这样既避免中间状态闪现,又让 Layui 能感知到每一次变更。
提交时 checkbox 数组要设 traditional: true
Layui 表单提交时,同名 checkbox 默认只传最后一个值。后台收不到数组,是因为 jQuery 的 $.param() 默认把数组序列化成 name=value1&name=value2,而很多后端框架(如 Spring MVC)需要 name[]=value1&name[]=value2 格式。
解决办法是在 form.on('submit(...)', function(data) {...}) 里手动发 AJAX,并加 traditional: true:
$.ajax({
url: '/api/batch',
method: 'POST',
data: data.field,
traditional: true, // 关键!否则 checkbox 数组变单值
success: function(res) { ... }
});
没加这个参数,后端看到的永远是字符串或单个值,不是数组。
真正容易被忽略的是:全选状态和实际勾选行为是两回事。UI 上打钩了,不代表数据已同步;你得确保每次勾选/取消都触发了 Layui 的状态更新,否则 data.field 里就没有对应字段。尤其在动态渲染、AJAX 加载后追加 checkbox 的场景,漏掉 form.render('checkbox') 就会彻底失联。


















