最可靠的方法是在submit回调中手动过滤空值字段。Layui的form.on('submit')不会自动跳过空字段,需对data.field中值为''、null、undefined或全空白字符串的键进行剔除,保留0、false、'0'等合法值,并注意checkbox/radio未选时不返回字段,无需额外处理。
提交前手动过滤空值字段最可靠
layui 的 form.on('submit(...)') 事件本身不会自动跳过空字段,它原样提交所有 input、select、textarea 的当前值(包括空字符串)。想“忽略空字段”,必须在提交回调里主动删掉键值为空的项。
常见错误是直接用 layui.form.val('formFilter') 拿到数据就发请求——这会把空字符串、null、undefined 全塞进去,后端还得额外判空。更糟的是,某些字段(如 select 未选时值为 '')看似没填,但已参与序列化。
- 只对值为
''、null、undefined、全空白字符串(' ')的字段做剔除;数字0、布尔false、字符串'0'等需保留 - 避免用
JSON.stringify()后正则替换,容易误删合法内容(比如值含"name":""的正常 JSON 字段) - 若表单含
checkbox或radio,注意未勾选时form.val默认不返回该字段,无需额外过滤
form.on('submit(formDemo)', function(data){
let params = {};
for(let key in data.field){
const val = data.field[key];
if (val !== null && val !== undefined && String(val).trim() !== ''){
params[key] = val;
}
}
// 此时 params 已剔除所有空/空白字段
$.post('/api/save', params, ...);
return false;
});
用 serializeArray() + 手动清洗更贴近原生逻辑
如果表单结构复杂(比如含动态增删行、嵌套 name 如 user[addr]),form.val() 可能解析不准。此时可退回到原生 DOM 方式:用 jQuery 的 $('form').serializeArray() 获取原始键值对数组,再清洗。
这个方式的好处是绕过了 Layui 内部字段映射逻辑,不受其表单组件(如 laydate、upload)是否正确绑定影响;坏处是需要自己处理 name="xxx[]" 这类数组写法。
-
serializeArray()对未选中的checkbox和radio完全不包含,天然“忽略” - 对
disabled字段也自动跳过,而form.val()有时仍会返回其值 - 清洗时仍要区分
'0'和'',建议用String(v.value).trim().length === 0判空
后端配合比前端“过滤”更稳妥
前端过滤只是减少无效传输,不能替代后端校验。尤其当用户禁用 JS 或绕过表单直接发请求时,空字段照样抵达接口。所以关键逻辑应在后端做:
- 接收参数后,对业务必填字段显式检查
isset()/!StringUtils.isBlank()等 - 对非必填字段,入库前统一执行
trim()或设为NULL(而非存空字符串) - 数据库字段尽量设
NULLABLE并默认NULL,避免用空字符串占位
前端过滤只是用户体验优化,不是数据可靠性保障。别为了“看起来干净”在前端写一堆边界判断,结果漏掉一个 0 导致金额归零。
自定义验证规则无法跳过字段提交
有人试图用 form.verify 给字段加 required 规则,以为不填就不提交——这是误解。verify 只控制是否允许提交(弹提示),一旦通过验证,所有字段照常提交,空值仍在。
例如给邮箱加了 email 规则,用户留空时会提示“请输入邮箱”,但若用户输入了空格再提交,验证可能通过(取决于你的正则),空格仍会作为值发出。
-
form.verify是拦截器,不是过滤器 - 想让某字段“可选且为空时不传”,唯一办法还是在
submit回调里手动删键 - 不要给非必填字段配
required,否则用户得填个占位符(如-)才能过关,体验更差
真正要注意的其实是“空”的定义:用户输了个空格算不算空?下拉框未选择是返回 '' 还是 undefined?这些细节不厘清,代码里 if (!val) 一句就可能误伤合法数据。多打几个 console.log 看真实值,比查文档更快。











