必须用 form.verify() 定义自定义规则(如 confirmpwd)来校验两次密码一致,不能依赖不存在的内置规则 password;需通过唯一 id(如 #pwd1)精准获取基准值,判断元素存在性并 trim 空格,避免模糊选择器、id 冲突及动态渲染后规则未重载。
两次密码(或任意两个字段)必须一致,不能靠 lay-verify="required" 或内置规则解决,必须用 form.verify() 写自定义规则,并确保 dom 查询能准确拿到对比值。
为什么直接写 lay-verify="required|password" 不生效
因为 password 不是 Layui 内置规则名,它只是你自定义规则的 key。如果没在 form.verify({}) 里声明,Layui 根本不认识这个字符串,会静默忽略——表单提交时完全不校验,也不报错。
-
lay-verify属性只负责“告诉 Layui 该用哪个规则”,不负责“定义规则” - 规则定义必须提前执行,且只能执行一次(通常在
layui.use(['form'], ...)回调里) - 若把
form.verify()写在表单渲染之后、或重复调用,后一次会覆盖前一次,容易漏掉规则
怎么写一个可靠的「两次输入一致」验证
核心是:用 jQuery 或原生 DOM 拿到第一个输入框的值,在第二个输入框的自定义规则函数里比对。注意必须用 .val().trim() 去除空格干扰,且要处理元素未找到的情况。
- 给密码输入框设唯一
id(如id="pwd1"),确认密码框用lay-verify="confirmPwd" - 在
form.verify()中定义confirmPwd规则,函数内用$('#pwd1').val().trim()获取基准值 - 必须判断
$('#pwd1').length === 0,否则页面加载顺序异常时会报$ is not defined或取到undefined - 不要用
$('input[name=pwd]')这类模糊选择器,name 可能重复、易受其他表单干扰
form.verify({
confirmPwd: function(value, item) {
var pwd1 = $('#pwd1');
if (pwd1.length === 0) return '原始密码字段未找到,请检查 id 是否正确';
if (pwd1.val().trim() !== value.trim()) {
return '两次输入的密码不一致';
}
}
});
常见翻车点:中文输入法、动态渲染、ID 冲突
用户打中文时频繁触发验证,或表单是 Ajax 加载进来的,都可能导致验证失败或提示错乱。
- 中文输入过程中(拼音未上屏),
input事件会多次触发,但value是中间态,此时比对必然失败——但 Layui 的验证默认绑在blur和submit,不是实时 input,所以一般不受影响;如果你自己加了实时监听,就得加event.isComposing判断 - 用
layui.form().render()动态渲染表单后,必须重新执行form.verify()定义(Layui 不自动重载规则) - 多个表单共用同一套 JS 逻辑时,
id="pwd1"若重复出现,$('#pwd1')只返回第一个,导致后续表单验证失效 - Thymeleaf 或其他模板引擎生成 ID 时带循环变量(如
id="pwd1_@{#i}"),JS 里硬编码$('#pwd1')就会失效
真正麻烦的不是写几行验证代码,而是确保那个「第一次输入的框」在验证执行瞬间确实存在、可读、且值是用户最终确认的版本——DOM 状态、执行时机、作用域隔离,三者缺一不可。











