直接用 form.verify 自定义校验即可,需分层判断密码强度(长度≥8、大小写字母、数字、特殊字符至少满足三项),并正确 return 提示字符串或 true。

layui 表单里怎么加密码强度校验?直接用 form.verify 就行
layui 本身不内置密码强度规则,但它的 form.verify 提供了自定义校验入口,你可以按需注入逻辑。关键不是“能不能”,而是“怎么写才不踩坑”——比如正则写错、提示覆盖、或校验时机不对。
常见错误现象:form.verify 里写死的正则只匹配字母+数字,结果用户输中文或符号就报错;或者没 return 提示语,导致表单静默失败;又或者把校验绑在 blur 上但没同步更新验证状态,提交时仍通过。
- 必须 return 字符串(非空)才会触发提示,return
true或 undefined 表示通过 - 校验函数接收两个参数:
value(输入值)和item(DOM 元素),别漏掉item - 建议在
form.verify中统一定义,避免每个 input 单独写lay-verify重复逻辑
怎么写一个靠谱的密码强度规则?别只靠正则
纯正则很难兼顾可读性和覆盖度。推荐分层判断:长度 ≥8、含大小写字母、含数字、含特殊字符 —— 四项至少满足三项。这样比 /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*]).{8,}$/ 更可控,也方便提示具体缺哪类。
示例(放在 layui.use(['form'], ...) 内):
form.verify({
pwdStrength: function(value, item){
let score = 0;
if (value.length >= 8) score++;
if (/[a-z]/.test(value)) score++;
if (/[A-Z]/.test(value)) score++;
if (/\d/.test(value)) score++;
if (/[^a-zA-Z\d\s]/.test(value)) score++;
if (score < 3) {
return '密码强度不足:请至少包含大写字母、小写字母、数字、符号中的三项';
}
}
});
注意:/[^a-zA-Z\d\s]/ 匹配非字母数字空白的字符,比罗列 [!@#$%] 更通用;\s 排除空格,防止用户用空格凑数。
怎么让密码强度提示实时显示,而不是只等提交?
layui 默认只在提交或失焦时触发 form.verify,但用户体验需要实时反馈。得手动监听 input 事件,用 form.val() 或直接读取 value,再调用自定义校验逻辑更新提示区域。
- 不要直接操作
layui.form.render(),它不刷新验证状态 - 给密码框加个
id="pwd",旁边放<div id="pwd-tip"></div>作提示容器 - 用
$('#pwd').on('input', ...)判断并写入提示,但注意别和 submit 冲突 —— 提交时仍以form.verify为准 - 避免高频触发:加个 300ms 防抖,不然用户连打几个字会反复重算
为什么校验通过了,提交时还报错?检查 form 绑定和 name 属性
最常被忽略的一点:layui 的 form.verify 只对 name 属性匹配的字段生效。如果你的密码 input 是 <input name="password">,但 verify 里写的是 pwdStrength,那必须在标签上加 lay-verify="pwdStrength",否则压根不走这个校验函数。
另一个坑:多个密码框(如“确认密码”)如果共用同一个 name,会导致校验逻辑混乱。应该分开命名,比如 name="pwd" 和 name="pwd_confirm",各自绑定不同规则。
还有兼容性注意:layui 2.8+ 支持 async verify,但老版本不支持 Promise,所有校验必须同步返回结果。
复杂点在于,强度校验本质是业务规则,不是格式校验——它没法靠单条正则兜底,得拆解维度、控制提示粒度、还要和 UI 反馈联动。很多人卡在“写了正则但提示不出现”,其实问题不在正则,而在没让 layui 知道该用哪个规则去验哪个字段。


















