应使用form.on('checkbox(filter)', callback)监听单个checkbox变化,data.elem.checked为新状态,data.value为其值;获取所有选中值需调用form.val('filter')或原生querySelectorAll遍历。

layui checkbox 怎么用 form.on('checkbox') 监听单个变化
这个事件只触发当前被点击的 checkbox,elem.checked 是它的新状态,elem.value 是它的值。它不负责收集“所有已选中项”,只是告诉你“这个框刚被点了一下”。如果你只关心实时响应某个 checkbox 的开关动作,用这个没问题;但想一次性拿到全部选中值,不能只靠它。
常见错误是写一堆 form.on('checkbox', function() { ... }) 然后在里面试图拼数组——结果要么漏掉初始已勾选的项,要么重复添加/删除。
获取所有已选中 checkbox 值的正确方式:用 form.val() 或原生 DOM 查询
form.val() 是最稳妥的方案,前提是你的 checkbox 都在同一个 form 容器里,且都设置了 name 属性(比如 name="interests")。Layui 会自动把同名 checkbox 的选中值聚合成数组。
示例:
form.val('myForm', { // 'myForm' 是 form 元素的 lay-filter 值
// 这里是设值,不是取值
});
取值就直接:
var data = form.val('myForm'); // 返回对象,如 { interests: ['reading', 'sports'] }
var selectedValues = data.interests || [];
如果没用 form 包裹,或想绕过 Layui 表单校验逻辑,也可以用原生方式:
var checkedElems = document.querySelectorAll('input[name="interests"]:checked');
var selectedValues = Array.from(checkedElems).map(el => el.value);
注意:document.querySelectorAll 返回的是 NodeList,要转成数组才能用 map。
为什么 $('input:checked').val() 只返回第一个值
jQuery 的 .val() 对多个元素调用时,只取第一个匹配元素的值,这是 jQuery 的设计行为,不是 bug。你看到的永远是第一个被选中的 checkbox 的 value,其余被忽略。
必须显式遍历:
$('input[name="interests"]:checked').map(function() {
return this.value;
}).get(); // 返回数组
或者更简单粗暴地避开 jQuery:
用 form.val() —— 它内部已经处理好了多值聚合,兼容 Layui 的渲染和重置逻辑,不容易出错。
初始化后 checkbox 状态没同步?检查 layui.form.render()
动态插入 checkbox、或 JS 手动修改了 checked 属性后,Layui 的样式不会自动更新,form.val() 也可能读不到最新状态。
必须手动通知 Layui 重新渲染:
- 如果是单个 checkbox:
form.render('checkbox', 'myForm'); - 如果是整组:
form.render('checkbox');
漏掉这步,form.val() 返回的还是旧数据,DOM 上看起来勾上了,但 JS 读不出来。
另外,确保 checkbox 的 name 属性一致且非空——Layui 依赖它做字段归类,没有 name 就不会被 form.val() 收集。


















