You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用JavaScript为密码输入框添加强度指示器及校验规则

密码强度指示器与自定义校验规则实现方案

核心逻辑

  • 预先定义好所有需要的密码校验规则,每条规则对应独立的判断函数
  • 给新密码输入框绑定输入事件,用户输入时实时校验所有规则,统计通过数量
  • 根据规则通过比例计算密码强度等级,同步更新强度条样式、提示文本,标记已满足/未满足的规则
  • 表单提交时做最终校验,不满足要求则阻止提交并提示

具体实现步骤

1. 补充页面结构

完全保留你原有代码的所有属性、类名和逻辑,仅在新密码输入框的input-group块闭合后,插入强度条和规则提示模块,修改后新密码部分的代码如下:

<p class="">
  <label class="t2" for="password_1">请输入新密码</label>
  <div class="input-group">
   <input type="password" class="field-settings" name="password_1" id="password_1" autocomplete="off" />
   <input type="checkbox" class="togglePw" id="pw_1" onclick="showPassword('password_1')"/>
   <label for="pw_1" class="fa"></label>
  </div>
  <!-- 新增以下代码 -->
  <div class="pw-strength-bar">
    <div class="pw-strength-level"></div>
  </div>
  <span class="pw-strength-text"></span>
  <ul class="pw-rule-list">
    <li data-rule="minLength">密码长度不小于8位</li>
    <li data-rule="lowercase">包含小写字母</li>
    <li data-rule="uppercase">包含大写字母</li>
    <li data-rule="number">包含数字</li>
    <li data-rule="special">包含特殊字符(!@#$%^&*等)</li>
  </ul>
</p>

2. 新增配套样式

把以下CSS代码追加到你原有样式表末尾即可,风格和现有表单保持统一:

/* 密码强度指示器样式 */
.pw-strength-bar {
  width: 100%;
  height: 6px;
  background: #efefef;
  border-radius: 3px;
  margin: 8px 0;
  overflow: hidden;
}
.pw-strength-level {
  height: 100%;
  width: 0;
  transition: all 0.3s ease;
  border-radius: 3px;
}
.pw-strength-text {
  font-size: 12px;
  display: block;
  margin-bottom: 8px;
}
.pw-rule-list {
  list-style: none;
  padding: 0;
  margin: 0 0 12px 0;
  font-size: 12px;
  color: #8C9099;
}
.pw-rule-list li {
  margin: 4px 0;
  padding-left: 18px;
  position: relative;
}
.pw-rule-list li::before {
  content: "\f00d";
  font: var(--fa-font-solid);
  position: absolute;
  left: 0;
  color: #ff4d4f;
}
.pw-rule-list li.passed {
  color: #52c41a;
}
.pw-rule-list li.passed::before {
  content: "\f00c";
  color: #52c41a;
}
/* 强度等级配色 */
.strength-weak .pw-strength-level { background: #ff4d4f; width: 25%; }
.strength-medium .pw-strength-level { background: #faad14; width: 50%; }
.strength-good .pw-strength-level { background: #52c41a; width: 75%; }
.strength-strong .pw-strength-level { background: #1E70EB; width: 100%; }

3. 新增交互逻辑

把以下JS代码追加到你原有脚本末尾,不需要修改你之前写的showPassword函数:

// 密码校验规则配置,可按需修改
const pwRules = {
  minLength: (val) => val.length >= 8,
  lowercase: (val) => /[a-z]/.test(val),
  uppercase: (val) => /[A-Z]/.test(val),
  number: (val) => /[0-9]/.test(val),
  special: (val) => /[!@#$%^&*(),.?":{}|<>]/.test(val)
}

// 获取关联DOM元素
const newPwInput = document.getElementById('password_1');
const confirmPwInput = document.getElementById('password_2');
const strengthBarWrap = newPwInput.closest('p').querySelector('.pw-strength-bar');
const strengthText = newPwInput.closest('p').querySelector('.pw-strength-text');
const ruleItems = newPwInput.closest('p').querySelectorAll('.pw-rule-list li');

// 监听新密码输入,实时更新校验状态和强度显示
newPwInput.addEventListener('input', function() {
  const pwVal = this.value;
  let passedCount = 0;
  // 逐条校验规则
  ruleItems.forEach(item => {
    const ruleKey = item.dataset.rule;
    const isPassed = pwRules[ruleKey](pwVal);
    if (isPassed) {
      item.classList.add('passed');
      passedCount++;
    } else {
      item.classList.remove('passed');
    }
  })
  // 重置强度状态
  strengthBarWrap.classList.remove('strength-weak', 'strength-medium', 'strength-good', 'strength-strong');
  if (!pwVal) {
    strengthText.textContent = '';
    return;
  }
  // 匹配对应强度等级
  let strengthLevel = '';
  let levelText = '';
  switch(true) {
    case passedCount <= 2:
      strengthLevel = 'strength-weak';
      levelText = '弱';
      break;
    case passedCount === 3:
      strengthLevel = 'strength-medium';
      levelText = '中等';
      break;
    case passedCount === 4:
      strengthLevel = 'strength-good';
      levelText = '良好';
      break;
    case passedCount === 5:
      strengthLevel = 'strength-strong';
      levelText = '强';
      break;
  }
  strengthBarWrap.classList.add(strengthLevel);
  strengthText.textContent = `密码强度:${levelText}`;
})

// 表单提交校验(可选,根据需求保留)
document.querySelector('form')?.addEventListener('submit', function(e) {
  const pwVal = newPwInput.value;
  // 新密码为空时代表不修改密码,直接放行
  if (!pwVal) return;
  // 校验所有规则是否满足
  const allRulePassed = Object.values(pwRules).every(checkFn => checkFn(pwVal));
  // 校验两次密码输入一致
  const pwMatch = pwVal === confirmPwInput.value;
  if (!allRulePassed || !pwMatch) {
    e.preventDefault();
    alert('请检查密码是否满足所有规则,且两次输入内容一致');
  }
})

/* 原有密码显示/隐藏逻辑 无需修改 */
function showPassword(targetID) {
  var pw = document.getElementById(targetID);
  if (pw.type === "password") {
    pw.type = "text";
  } else {
    pw.type = "password";
  }
}

自定义调整方法

  • 修改最小长度要求:直接调整pwRules里minLength的判断数值,比如要求最少10位就改为val.length >= 10
  • 增删校验规则:在pwRules对象里新增/删除校验函数,同时在HTML的规则列表里新增/删除对应data-rule属性的<li>项即可
  • 修改强度阈值/配色:调整JS中switch判断的passedCount区间,或者修改CSS中对应强度类的宽度、颜色属性即可

内容的提问来源于stack exchange,提问作者Snorlax

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 23:24:25