最常见原因是表单容器缺失layui-form类或form标签未正确包裹,且lay-verify必须写在input/select/textarea等控件上,不能写在div或label上。

lay-verify属性写了但完全没反应
最常见原因是表单容器缺失 layui-form 类,或 form 标签没被正确包裹。Layui 只扫描带有 layui-form 类的容器下的元素,且要求 lay-verify 必须写在 input、select、textarea 等可验证控件上,不能写在 div 或 label 上。
检查这几点:
-
<form class="layui-form"></form>—— 必须有这个 class,不是layui-form-pane单独存在就行 -
lay-verify值必须是内置规则(如required、email)或已注册的自定义规则名,拼写错误或大小写不一致都会静默失效 - 控件必须有
name属性,否则 Layui 提交时直接跳过该校验项 - 不要把表单 DOM 插入后就立刻监听
form.on('submit'),得等form.render()执行完再绑定
动态添加的 input 无法触发 lay-verify
页面加载后 JS 插入的 <input name="phone" lay-verify="phone"> 默认不会被监听 —— Layui 初始化只扫描一次 DOM。
必须手动补全两步:
- 插入 DOM 后立即调用
form.render('input')(若含select或开关,对应加form.render('select')等) - 如果用了自定义验证规则,规则函数里别依赖
value参数(它只取第一个匹配控件的值),改用item获取当前 DOM,再通过item.name或item.className做特征判断 - 删除动态控件前,先清空值、移除
.layui-form-danger类和相邻的提示元素,否则残留状态会导致后续提交误报
点击“确定”按钮(layer 弹层)没触发验证
弹层里的按钮默认是普通按钮,不带 lay-submit,所以 lay-verify 完全不启动。
正确做法不是改按钮 type,而是把弹层“确定”按钮和 Layui 表单提交机制桥接起来:
- 在弹层
success回调里,给确定按钮(如.layui-layer-btn0)加上lay-filter和lay-submit属性 -
lay-filter的值要和form.on('submit(filterName)')中的 filterName 严格一致 - 确保弹层内容区域(
content)里的form已有layui-form类,且form.render()已执行 - 别在
yes回调里手动收集数据并$.post—— 那样绕过了验证流程;应让lay-submit触发form.on('submit'),在回调里处理成功逻辑
radio / checkbox / 多个同 name input 校验失败
这些控件的校验逻辑和单值输入框不同,lay-verify="required" 对它们基本无效。
具体差异:
-
radio组必须所有选项name完全相同,且至少一个带required属性;动态渲染后要调form.render('radio') -
checkbox组不能靠required,得写自定义规则:用$(item).attr('name')拿 name,再查$form.find('input[name="xxx"]:checked').length - 多个同
name的input(如name="tag[]")会被data.field覆盖成最后一个值 —— 校验必须手动遍历$('input[name="tag[]"]').map(...),别传给form.verify()的value
.layui-form-danger 类,所以任何滚动、高亮、提示逻辑都必须严格绑定在验证失败的「当下」,而不是监听 class 变化或依赖 DOM 状态缓存。











