form.verify() 必须在 form.render() 之前执行且置于 layui.use(['form'], function(){...}) 内,否则规则不生效;规则名需唯一、非内置,验证函数返回 false 或提示字符串表示失败,undefined/true/空字符串表示通过。

必须用 form.verify() 注册,且必须在 form.render() 之前执行,否则规则不生效。
自定义规则必须在 form.render() 前注册
这是最常踩的坑:把 form.verify() 写在 form.render() 后面,或写在 DOM 加载完成前(比如没包在 layui.use(['form'], function(){...}) 里),规则就完全不会触发。
-
form.verify()是往全局规则池里“塞函数”,表单初始化时才去读这个池子;晚了就来不及了 - 动态插入的表单元素(如 JS 新增的
<input>),如果已调过form.render(),得先注册规则再 render,不能反过来 - 规则名必须是字符串,且不能和内置规则(
required、email等)同名,否则会被覆盖
验证函数接收 value 和 item,返回 false 或提示字符串
回调函数签名固定:function(value, item)。其中 value 是当前 input 的值(对 checkbox 多数情况无用),item 是原生 DOM 元素,可用于取 name、dataset 或定位兄弟节点。
- 返回
false或非空字符串(如'不能为空')表示校验失败 - 返回
undefined、true或空字符串表示通过 - 别在函数里直接操作
item.value或item.disabled——layui 会跳过 disabled/readonly 元素的验证
多选框(checkbox)至少选一个怎么写
内置 required 对 checkbox 无效,必须靠 name 统一 + jQuery 查询勾选项数量实现。
- HTML 中所有待校验的 checkbox 必须有相同
name(如name="hobby"),且不能漏写 - 规则里用
$('input[name="' + item.name + '"]:checked').length统计,为 0 就返回提示 - lay-verify 属性可以加在任意一个 checkbox 上,不必每个都加
- 若用 Layui 2.x(不依赖 jQuery),改用
document.querySelectorAll('input[name="hobby"]:checked').length
正则校验写法与局限
支持数组写法:idcard: [/^\d{17}[\dXx]$/, '身份证格式不对'],但这种写法无法访问其他字段或 DOM 属性。
- 无法读取另一个输入框的值(比如“确认密码”比对)
- 无法根据
item.dataset.minLength动态取参数 - 需要跨字段或带参数的逻辑,必须用函数形式,而非正则数组
- 正则本身建议分步写:先长度、再号段、再校验码(身份证强烈推荐用
idcard-validation这类成熟库)
真正容易被忽略的是:规则名一旦注册就全局有效,后续同名调用会覆盖;还有就是移动端 checkbox 快速连点时 change 事件可能丢失,导致验证滞后——这种场景下,form.on('submit') 里手动校验更稳。











