Layui不支持form.on('blur()')事件,必须改用form.on('change(filter)')实现失焦校验;动态元素需先form.render('input'),表格编辑应优先使用table.on('edit(filter)')。

直接用 form.on('blur(filter)') 不行,Layui 没这个事件类型
Layui 的 form 模块不支持原生 blur 事件的监听语法,比如 form.on('blur(username)', ...) 会静默失效。这不是你写错了,是 Layui 根本没注册这个事件名。它的事件体系里只有 input、change、focus 等有限几个,且 blur 被明确排除在外。
常见错误现象:
– 写了 form.on('blur(...) 却完全没触发
– 改用原生 elem.addEventListener('blur', ...),但动态渲染的表单(如 layer 弹窗内、table 编辑框)会漏绑或重复绑定
- 必须改用
form.on('change(filter)'):它在输入框失焦且值发生变更后触发,语义最接近“编辑完成” - 若需“只要失焦就执行”(不管值变没变),得手动给元素绑定原生
blur,但要确保 DOM 已存在——推荐在success回调(layer)、done回调(table)或layui.use后再操作 - 对表格单元格内的编辑框,别绑到
input上,而应委托到表格容器:$(tableElem).on('blur', 'input[lay-edit]', handler),避免每次双击都重新绑定
表格 edit 列的失焦,优先用 table.on('edit(filter)')
table.on('edit(filter)') 是 Layui 表格编辑场景下唯一可靠的“失焦后动作”入口。它不是原生 blur,而是在用户确认编辑(失焦、回车、点击其他单元格)后触发,自带新旧值、字段名、整行数据,且已做过防抖和焦点状态判断。
容易踩的坑:
– 列配置里没加 edit: 'text'(或其他类型),事件永远不会触发
– lay-filter 值和 table.render() 中不一致,监听直接失效
– 在 templet 自定义列里写了 input,但没加 contenteditable="true",Layui 会跳过内置编辑逻辑,edit 事件也收不到
- 回调参数
obj.value是新值,obj.oldValue是原始值,校验失败可直接return false阻止写入 - 若需保存到后端,别在回调里直接发请求,先做
obj.value.trim()和类型转换(如parseInt(obj.value)),再防重复提交 - 移动端要注意:软键盘收起有延迟,
edit可能比预期晚触发 200~500ms,别依赖它做即时 UI 反馈
layer 弹窗里的表单,blur 绑定时机很关键
layer 弹窗内容是动态插入 DOM 的,如果在 layer.open() 外部直接查 $('input') 并绑 blur,大概率查不到——因为弹窗 DOM 还没渲染完。正确时机是 success 回调,此时节点已挂载,且只执行一次。
示例错误写法:layui.$('input[name="title"]').on('blur', ...) —— 页面初始化时就执行,弹窗还没出来
正确写法:layer.open({ ..., success: function(layero, index) { layui.$(layero).find('input[name="title"]').on('blur', function() { ... }); } });
- 用
layui.$(layero)限定作用域,避免污染全局事件 - 如果弹窗可能多次打开(如编辑不同数据),记得在下次打开前解绑旧监听,或用事件委托:
layui.$(layero).on('blur', 'input', handler) - 遮罩层(
.layui-layer-shade)点击不会触发内部 input 的 blur,因为 Layui 主动阻止了冒泡;如需点击遮罩关闭并触发保存,得单独监听 shade 的 click,再手动调用input.blur()
表单提交按钮点击时失焦事件抢跑,导致按钮无效
典型现象:输入完直接点「保存」按钮,按钮没反应。原因是输入框先触发 blur,里面执行了异步校验或 AJAX,还没结束,按钮的 click 就被浏览器忽略或延迟了。
根本原因不是事件顺序问题,而是 blur 回调里做了耗时操作(如未加 await 的 Promise、同步 AJAX),阻塞了后续事件流。
- 解决方法一:把保存逻辑从 blur 移到按钮的
mousedown或click事件里,用form.val('filterName')主动取值 - 解决方法二:blur 里只做轻量校验(如非空、邮箱格式),把真正保存交给按钮事件,两者解耦
- 千万别在 blur 回调里写
$.ajax({ async: false })—— 这在现代浏览器已被禁用,会直接报错
复杂点在于:blur 和按钮 click 的执行边界模糊,尤其在移动端,软键盘收起、焦点切换、事件队列调度都不可控。最稳的方案,是放弃“失焦即保存”的执念,改用显式操作(按钮、回车键)作为唯一提交入口。


















