layui checkbox 的 form.val() 拿不到值,因需同时满足:每个 checkbox 必须有 name 和 value 属性,且调用 form.render('checkbox') 才能被 layui 正确接管并同步状态。
layui form checkbox 为什么 form.val() 拿不到选中的值
因为 layui 的 checkbox 默认不走表单原生的 value 提交逻辑,而是靠 lay-filter + 事件监听驱动,form.val() 只读取有 name 且被正确初始化的控件——而 checkbox 若没设 value 或未触发渲染,就会返回空数组或 undefined。
- 确保每个
<input type="checkbox">都带name和value,例如:<input type="checkbox" name="hobby" value="read"> - 必须调用
form.render('checkbox')(或form.render())让 layui 接管 DOM,否则勾选状态不会同步到内部状态 -
form.val('formFilter')返回的是对象,key 是name,value 是字符串或字符串数组;单个 checkbox 返回字符串,多个同名 checkbox 返回数组 - 如果只用一个 checkbox(无其他同名项),
form.val()会返回字符串"on"而非value值——这是浏览器原生行为,layui 未覆盖,得手动处理
获取 checkbox 选中值的两种可靠方式
别只依赖 form.val(),尤其在动态增删、异步加载或未触发 render 的场景下,直接读 DOM 更稳。
- 用
form.on('checkbox(filterName)', callback)监听变化:回调里this.checked是当前状态,this.value是value属性值,适合做即时响应 - 手动查 DOM:
$('input[name="hobby"]:checked').map((i, el) => el.value).get(),绕过 layui 状态,100% 反映真实勾选情况 - 若用
form.val(),务必确认表单已绑定lay-filter,且所有 checkbox 在form.render()后才操作
layui checkbox 的 value 和 name 容易忽略的细节
name 决定分组,value 决定提交内容,但很多人漏写 value,导致取到空字符串或 "on"。
- 没写
value的 checkbox,勾选后form.val()返回"on"(浏览器默认),不是你想要的业务标识 - 多个 checkbox 共享同一
name,但value重复,form.val()会去重,可能丢数据 - name 带中括号如
hobby[],layui 支持,但后端解析需对应,前端取值仍是数组,无需额外处理 - 禁用的 checkbox(
disabled)不会被form.val()采集,也不会触发checkbox事件
动态添加 checkbox 后取不到值?
动态插入的 DOM 不会被 layui 自动接管,form.val() 和事件监听都失效。
- 插入完 HTML 后,立刻执行
form.render('checkbox', 'yourFilter'),第二个参数是表单的lay-filter值 - 不要在插入前就绑定
form.on('checkbox(...)'),事件委托只对初始 DOM 有效;动态元素需用layui.jquery的事件代理,或重新绑定 - 如果用
$.append()批量加 checkbox,建议统一加完再render一次,避免多次重绘影响性能
value、忘调 render、或误以为 form.val() 能自动捕获所有变更,是最常卡住的地方。











