应使用 input 事件实时检测密码强度,它覆盖输入、粘贴、删除等所有场景;需从长度≥8、大写字母、小写字母、数字/特殊字符四维度综合评分(0–4分),并前后端校验逻辑严格对齐。

密码强度检测该用哪个事件监听
用户输密码时就得实时反馈,input 事件最可靠——它在每次输入(包括粘贴、删除、自动填充)后都触发,比 keyup 更全面。别用 change,它只在失焦时触发,完全不符合“边输边提示”的需求。
注意:如果用了防抖,延迟别超过 300ms,否则肉眼可见卡顿;粘贴大段文本时,input 仍会触发,但需确保判断逻辑不因字符串过长而阻塞主线程。
判断逻辑里必须检查的四个维度
只看长度或大小写字母是不够的。真实场景中,用户常输 123456 或 Password1 这类看似合规实则极弱的密码。必须同时验证:
-
length >= 8(最低门槛,少于 8 位直接判弱) - 包含至少一个大写字母:
/[A-Z]/.test(password) - 包含至少一个小写字母:
/[a-z]/.test(password) - 包含至少一个数字或特殊字符:
/[0-9!@#$%^&*()_+-=[]{};':"\|,./?]/.test(password)
漏掉任意一项,都会让“强密码”判定形同虚设。比如 ABCDEF12 缺小写,password123 缺大写,都应归为“中”或“弱”。
立即学习“前端免费学习笔记(深入)”;
指示器 UI 状态与分数映射怎么定才合理
别用模糊的“弱/中/强”文字,用户看不懂阈值在哪。推荐按满足项数给分(0–4 分),再映射到颜色和文案:
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
- 0–1 分 → 红色,显示“太弱”(如纯数字或长度不足)
- 2 分 → 橙色,显示“一般”(如只有大小写+长度,缺数字/符号)
- 3 分 → 黄色,显示“较好”(四项缺一)
- 4 分 → 绿色,显示“安全”(全部满足)
示例代码片段(仅逻辑):
function getPasswordScore(password) {
let score = 0;
if (password.length >= 8) score++;
if (/[A-Z]/.test(password)) score++;
if (/[a-z]/.test(password)) score++;
if (/[0-9!@#$%^&*()_+-=[]{};':\"|,.<>/?]/.test(password)) score++;
return score;
}
注意:正则中的反斜杠要双写(\),否则在 JS 字符串里会转义失败;特殊字符集别贪多,!@#$%^&*() 已覆盖主流平台允许范围,加太多反而增加误判可能。
为什么不能只依赖前端检测
前端校验纯粹是体验优化,input 事件能被绕过,正则可被禁用,用户甚至能直接删掉 DOM 节点。所有强度逻辑必须在服务端重复执行,且规则要严格对齐。
常见疏忽:后端用不同正则(比如没校验特殊字符),或长度阈值设成 6 位,导致前端显示“安全”,提交却报错。前后端的判断函数最好共用同一份配置对象,避免维护两套逻辑。
真正难的是平衡——太严,用户反复失败;太松,形同虚设。从 getPasswordScore 返回的 0–4 分开始,先跑一周真实数据,看用户卡在哪个分段,再针对性调整阈值。


















