最直接可靠的方式是在 form.on('submit()') 回调中手动清洗 data.field:遍历并剔除 null、undefined、空字符串及全空白字符串,保留 0、false、'0' 等合法值;动态表单建议用 serializeArray() + FormData;前后端均需校验。

提交时过滤空参数,最直接可靠的方式是在 form.on('submit()') 回调里手动清洗 data.field 对象,而不是依赖 Layui 自动跳过 —— 它根本不会跳。
为什么 form.val() 或 data.field 里会有空字段
Layui 的表单序列化机制会把所有带 name 属性的控件当前值(包括 ''、' '、null、undefined)都塞进 data.field。比如用户没选 select,它的值就是空字符串;textarea 里只敲了几个空格,也会原样传过去。
- 空字符串
''、全空白字符串' '、null、undefined都应剔除 - 数字
0、布尔false、字符串'0'必须保留 —— 它们是合法业务值 -
checkbox和radio未选中时默认不进data.field,不用额外处理
如何安全地剔除空字段(推荐写法)
用 for...in 遍历 data.field,对每个值做严格判空,生成新对象:
form.on('submit(formDemo)', function(data){
let params = {};
for (let key in data.field) {
const val = data.field[key];
// 只保留非空、非全空白、非 null/undefined 的值
if (val != null && typeof val === 'string' ? val.trim() : true) {
params[key] = val;
}
}
$.post('/api/save', params, function(res) {
layer.msg('提交成功');
});
return false;
});
- 用
val != null同时排除null和undefined - 对字符串类型再执行
.trim(),避免' '漏网 - 非字符串(如
0、false、[])直接保留,不走.trim()路径
遇到动态表单或 name 带方括号时怎么办
如果表单含数组写法(如 name="hobby[]")或嵌套结构(如 name="user[phone]"),form.val() 解析可能不准,建议退回到原生方式:
const formData = new FormData();
$('form').serializeArray().forEach(item => {
const val = item.value;
if (val != null && (typeof val !== 'string' || val.trim())) {
formData.append(item.name, val);
}
});
$.ajax({ url: '/api/save', method: 'POST', data: formData });
-
serializeArray()天然忽略未勾选的checkbox/radio,也跳过disabled字段 - 它返回的是标准键值对数组,不依赖 Layui 内部映射逻辑,兼容性更强
- 注意:要自己处理
[]类型,后端需能接收FormData格式
真正容易被忽略的是:前端过滤只是减少无效传输,不能替代后端校验。用户禁用 JS、用 curl 直接发请求、或绕过表单修改 DOM,空字段照样抵达接口 —— 所有关键判空逻辑,必须在服务端重做一遍。


















