form.val 设置的值提交时没生效,因其仅更新 Layui 缓存而不触发原生 DOM 变化;应直接操作 DOM 的 value/checked/selected 属性,并在修改 select 或 checkbox 后调用 form.render() 同步 UI。
form.val 设置的值为什么提交时没生效?
因为 form.val 只是同步表单 dom 的 value 到 laydata 缓存,并不触发原生表单控件的 input 或 change 事件,后端接收时读的是 dom 实际值(尤其是 select、checkbox、radio 这类控件),而 layui 的渲染层和原生 dom 值可能脱节。
拦截 submit 事件后用原生 DOM 修改值最可靠
不要依赖 form.val 的返回值去“二次赋值”,直接操作 DOM 元素的 value、checked、selected 属性。Layui 表单提交本质仍是原生 submit,最终提交内容由 DOM 决定。
实操建议:
- 给
form绑定submit事件,用e.preventDefault()拦截 - 用
document.querySelector或$获取目标元素,直接改.value/.checked/.selectedIndex - 若涉及
select下拉框,记得同时调用form.render('select')同步 Layui 样式(否则 UI 不刷新) - 修改完再调用
form.submit()(手动触发表单提交)或用$.ajax发送数据
示例:把隐藏字段 user_role 改为后台要求的枚举值
form.on('submit(*)', function(data){
const elem = document.querySelector('[name="user_role"]');
if (elem) {
elem.value = 'admin'; // 直接写死或根据逻辑计算
}
// 注意:如果是 select,还要 form.render('select');
return false; // 阻止默认提交,后续可 ajax 提交
});
想用 form.val 读取后再改?必须配合 DOM 同步
form.val('example') 返回的是 Layui 缓存的对象,修改它本身不影响 DOM;反向操作——先改 DOM,再调 form.val('example', {...}) ——也只更新缓存,不保证 DOM 已就绪。真正安全的流程是:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 先用
form.val('example')读原始值做判断 - 用原生方式修改对应 DOM 元素(如
input[name="xxx"].value = "new") - 如有必要,再调
form.val('example', {xxx: "new"})更新缓存(仅当后续还依赖form.val读取时才需要) - 对
checkbox/radio,必须操作.checked属性,不能只改value
容易被忽略的 checkbox 和 radio 处理细节
Layui 对多选 checkbox 的处理是收集所有 checked 的 value 合成数组,但如果你只调 form.val 赋值,它不会自动勾选/取消 DOM 节点。必须显式设置 .checked = true/false。
常见错误现象:form.val('formDemo', {agree: true}) 执行后界面上 checkbox 未打钩,提交时该字段丢失。
正确做法:
- 定位到具体 checkbox 元素:
document.querySelector('input[name="agree"]') - 设值:
elem.checked = true - 如果是一组同名 checkbox,需遍历所有并按需设
checked - 最后调
form.render('checkbox')确保 Layui 自定义样式同步
复杂点在于:Layui 的 render 不会监听 DOM 属性变化,它只在初始化或显式调用时重绘。所以任何 JS 修改都得自己补上 form.render,否则看到的 UI 和实际提交的值对不上。










