layui表单失焦验证应使用form.on('change')事件,它在值变化且失焦后触发,确保form.val()与校验状态一致;动态input需先form.render('input');提交前统一trim可批量处理但无实时反馈。
layui 表单如何让 input 失焦时才验证(而非实时)
默认情况下,layui 的 lay-verify 会在输入过程中(input 事件)反复触发校验,这对数字型、带小数点的字段极不友好——比如输 11. 会被立刻判为非法,导致输入中断。失焦验证才是合理时机,但 layui 原生不支持直接配置 trigger="blur"。
form.on('change') 是最稳妥的失焦验证入口
layui 的 form.on('change', selector, fn) 事件本质是「值变化 + 失焦」后才触发,天然符合需求,且与内部状态同步。它比原生 blur 安全,不会破坏 form.val() 和校验缓存的一致性。
- 必须用
data.elem.value获取并操作 DOM 值,避免this.value在闭包中指向异常 - 若需去空格,直接写
data.elem.value = data.elem.value.trim(),后续form.val()能拿到已处理值 - 若要在此时触发校验,调用
form.validate(field)(需该字段已配置lay-verify) - 动态添加的 input 必须先执行
form.render('input'),否则change不生效
提交前统一 trim + 校验(适合无 name 或批量处理)
当 input 没有 name 属性,或你不想为每个字段单独绑定 change,可在 form.on('submit') 中统一处理:
form.on('submit(formDemo)', function(data){
// 批量 trim 所有 text 类型 input
layui.$('input[type="text"], input[name]').each(function(){
this.value = this.value.trim();
});
// 再执行校验(此时值已更新,form.val() 也同步)
form.validate();
return false; // 阻止默认提交,等异步校验完成再放行
});
注意:这个方式做不到「失焦即反馈」,错误提示会延迟到点击提交时才出现,用户体验略弱于 change 方案。
自定义验证规则里别依赖 blur,改用 form.validate() 主动控制
比如用户名唯一性校验,不能靠 onblur 发请求再回调 callback(),因为 layui 的内置验证链不等待异步。正确做法是:
- 把 input 的
lay-verify设为自定义规则名,如lay-verify="uniqueName" - 在
form.verify()里只做同步判断(例如长度、格式),**不发请求** - 在
form.on('change', 'input[name="username"]')里手动发请求,成功后调用form.validate('username')强制重验 - 失败时用
layui.layer.tips('已存在', elem, {tips: [1, '#FF5722']})直接提示,绕过验证链限制
真正容易被忽略的是:layui 的验证状态和 DOM 值不是强绑定的,手动改 value 后不走 form.on('change') 或不调 form.validate(),提交时拿到的仍是旧值——这点在动态表单和接口联动场景下极易出错。


















