form.val() 默认不包含 disabled 字段,因遵循 html 规范;需在取值前临时移除 disabled 属性,调用 form.val() 后再恢复,或改用 serializearray() 配合手动控制 disabled 状态。

默认情况下,form.val() 和 Layui 表单内部序列化逻辑**不会包含 disabled 字段**——这是浏览器原生行为,Layui 没有绕过它。想让 disabled 字段参与提交,必须手动干预 DOM 状态或序列化过程。
为什么 form.val() 读不到 disabled 字段
这不是 Layui 的 bug,而是 HTML 规范:所有 disabled 表单控件的值在表单提交、FormData 构造、serialize() 或 form.val() 中都会被自动忽略。Layui 的 form.val() 底层依赖原生 DOM 查询,无法突破这一限制。
- 即使你用 JS 动态设置了
elem.value = 'xxx',只要elem.disabled === true,form.val()就返回undefined或跳过该字段 -
form.on('submit')回调里的data.field同样不包含 disabled 字段,和form.val()行为一致 - 别指望
form.render()或版本升级能改变这点——它是底层约束,不是渲染问题
提交前临时启用 disabled 字段再调 form.val()
最直接可控的方式:在 form.on('submit') 开头,把目标字段的 disabled 属性临时移除,调 form.val() 取值,再按需恢复(如果 UI 还需保持禁用状态)。
- 先保存原始状态:
const wasDisabled = elem.disabled; - 临时启用:
elem.disabled = false; - 立即执行
form.val('filterName')或触发一次form.render('input')(确保封装组件如 select/checkbox 的值能被读取) - 提交后,根据需要恢复:
elem.disabled = wasDisabled;;若用form.render()刷新了 UI,记得再调一次以同步灰显样式 - 注意:对
select、checkbox等封装组件,仅改原生disabled不够,必须配form.render('select')或form.render('checkbox')才能让值被form.val()读到
绕过 form.val(),用原生 DOM + serializeArray() 强制包含
如果你只需要“把 disabled 字段塞进请求”,不强依赖 Layui 的字段映射逻辑,$('form').serializeArray() 是更底层、更可预测的选择——但它默认也跳过 disabled 字段。要让它包含,得先临时移除 disabled 属性:
- 遍历所有
input, select, textarea,收集原本 disabled 的元素:const disabledElems = $('form :input:disabled'); - 批量移除属性:
disabledElems.prop('disabled', false); - 调用
$('form').serializeArray()获取全部字段(含刚才放开的) - 提交后,立刻恢复:
disabledElems.prop('disabled', true);,并视情况调form.render()同步 UI - 这个方式对 name 带数组语法(如
user[addr])或动态增删行的表单更稳定,不受 Layui 内部解析逻辑影响
真正容易被忽略的点
很多人试了“设 disabled → 调 render → 以为 form.val() 就能读到”,结果还是空——因为 form.render() 只负责重绘 UI 和绑定事件,**它不改变浏览器对 disabled 字段的序列化规则**。能否读到值,只取决于 DOM 元素在调用 form.val() 那一刻的 disabled 状态。时间差、异步操作、render 未完成,都会导致状态错位。最稳妥的做法永远是:在取值前那一帧,确保目标元素的 disabled 属性为 false。











