最常见原因是表单未被layui form模块识别:缺少class="layui-form"、元素无name属性、动态内容未调用form.render()、layer弹窗中按钮未加lay-submit属性或未正确监听submit事件。
lay-verify 属性写了但没反应,最常见原因是什么?
根本不是规则写错,而是表单压根没被 layui 的 form 模块“扫描到”。lay-verify 不是浏览器原生属性,它只在 layui 初始化并识别到对应 dom 后才生效。
- 表单容器缺失
class="layui-form"—— 这是 form 模块识别表单的硬性门槛,缺了就等于没注册 -
input或select元素没有name属性 —— layui 验证靠name匹配字段,没 name 就不校验 - 弹出层内容是动态插入的(比如
layer.open({ content: htmlStr })),但没调form.render()—— 初始页面加载时,这些 DOM 还不存在,自动渲染自然跳过它们 - 用了
type=0(纯 HTML 字符串弹窗)而不是type=1(DOM 节点弹窗)——type=0会把内容当纯文本处理,lay-*属性全失效
layer 弹窗里点击“确定”按钮,验证就是不触发,为什么?
因为 layer 的 yes 回调和 form 的验证机制是两套系统。你点“确定”,只是执行 JS 函数,不会自动触发表单 submit 事件,更不会走 lay-verify 流程。
- 必须让“确定”按钮具备
lay-submit属性,并绑定lay-filter,例如:<button lay-filter="addForm" lay-submit>确定</button> - 同时在 JS 中监听:
form.on('submit(addForm)', function(data){...}),所有验证、取值、提交逻辑都放这里 - 千万别用
$('#btn').on('click', ...)或直接layero.find('button').click()—— 这绕过了 layui 表单事件流,lay-verify彻底失能
动态生成的表单元素(如 AJAX 加载后插入的 input),验证总失效
不是规则丢了,是验证规则没重新绑定到新节点上。layui 的 form.render() 不是“刷新样式”,而是“重新解析 + 绑定事件”。
- 插入新 DOM 后,立刻调用:
form.render('select')、form.render('checkbox')或通用的form.render() - 如果只渲染新增部分,用:
form.render('add')(注意:这是 layui 2.8+ 支持的参数,旧版不识别) - 确保调用时机在 DOM 真正挂载之后 ——
$.html()后加.promise().done(() => form.render()),或简单粗暴用setTimeout(() => form.render(), 0) - 检查新元素的父级是否带
layui-form类,且lay-filter值和 JS 中监听的完全一致(大小写、空格、引号都不能差)
表单能提交,但 required/number 校验提示一闪而过就消失
这不是验证没跑,是验证弹层(layer.msg 或内置提示)和你的弹窗共用了 layer.index,导致你调 layer.close(layer.index) 关掉的是提示层,不是原始弹窗。
- 打开弹窗时立刻存 index:
var layerIndex = layer.open({...}) - 所有关闭操作都用这个变量:
layer.close(layerIndex),别依赖layer.index - 验证失败时,不要手动
layer.msg()—— layui 的lay-verify自带提示,只要配置正确就会显示;手动干预反而容易破坏流程 - 如果用了自定义
form.verify,return 的字符串会被自动作为提示内容,无需额外 layer 调用
lay-verify 就安静得像没写过一样。











