密码强度检查器:对勾无法显示绿色(始终红色)的问题求助
解决密码强度检查器的指示器颜色问题
问题核心是你已定义了.valid绿色样式,但未在JavaScript中根据验证结果为指示器元素添加/移除该类,导致始终应用.indicator的红色样式。以下是修复方案:
步骤1:修改JavaScript逻辑
优化重复正则测试,并通过类切换实现颜色变化:
document.getElementById("password").addEventListener("input", function() { var password = this.value.trim(); var capitalCheck = document.getElementById("capitalCheck").querySelector(".indicator"); var numberCheck = document.getElementById("numberCheck").querySelector(".indicator"); var symbolCheck = document.getElementById("symbolCheck").querySelector(".indicator"); // 存储验证结果,避免重复正则测试 var hasCapital = /[A-Z]/.test(password); var hasNumber = /\d/.test(password); var hasSymbol = /[!@#$%^&*()_+\-=[\]{};':"\\|,.<>/?]/.test(password); // 设置指示器文本 capitalCheck.textContent = hasCapital ? '✔' : '✘'; numberCheck.textContent = hasNumber ? '✔' : '✘'; symbolCheck.textContent = hasSymbol ? '✔' : '✘'; // 根据结果切换valid类,实现颜色变化 capitalCheck.classList.toggle("valid", hasCapital); numberCheck.classList.toggle("valid", hasNumber); symbolCheck.classList.toggle("valid", hasSymbol); // 移除冗余的visibility设置(两边均为visible) });
步骤2:确认CSS优先级
你的CSS已正确定义样式,且.valid在.indicator之后定义,优先级足够覆盖红色:
span.indicator { font-size: 16px; color: red; } span.valid { color: green; }
完整修改后的代码
HTML
<br> <br> <br> <div class="info-container"> <p>Indsæt tekst her...</p> </div> <div class="container"> <h1>Password Strength Checker</h1> <label for="password">Enter Password:</label> <input type="password" id="password" placeholder="Password"> <div class="criteria"> <div class="criteria-item" id="capitalCheck">Capital Letters: <span class="indicator"></span></div> <div class="criteria-item" id="numberCheck">Numbers: <span class="indicator"></span></div> <div class="criteria-item" id="symbolCheck">Symbols: <span class="indicator"></span></div> </div> <button onclick="calculateTime()">Calculate</button> <div id="result"></div> </div>
CSS
.info-container { background-color: #f0f0f0; padding: 20px; margin-bottom: 20px; border: 1px solid #ccc; border-radius: 5px; text-align: center; } .container { background-color: #fff; padding: 30px; width: 400px; border-radius: 5px; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); } .criteria-item { margin-bottom: 10px; } body { font-family: Arial, sans-serif; background-color: #f5f5f5; margin: 0; padding: 0; display: flex; justify-content: center; align-items: center; height: 100vh; flex-direction: column; align-items: center; justify-content: flex-start; } .container>h1 { font-size: 24px; text-align: center; margin-bottom: 20px; } label { font-size: 16px; display: block; margin-bottom: 10px; } input[type="password"] { width: 100%; padding: 10px; margin-bottom: 20px; border: 1px solid #ccc; border-radius: 3px; } button { padding: 10px 20px; background-color: #007bff; color: #fff; border: none; border-radius: 3px; cursor: pointer; font-size: 16px; transition: background-color 0.3s ease; } button:hover { background-color: #0056b3; } p#result { margin-top: 20px; font-size: 18px; text-align: center; } ul.criteria { display: flex; justify-content: space-between; margin-bottom: 20px; } ul.criteria>li { font-size: 16px; } span.indicator { font-size: 16px; color: red; } span.valid { color: green; }
JavaScript
document.getElementById("password").addEventListener("input", function() { var password = this.value.trim(); var capitalCheck = document.getElementById("capitalCheck").querySelector(".indicator"); var numberCheck = document.getElementById("numberCheck").querySelector(".indicator"); var symbolCheck = document.getElementById("symbolCheck").querySelector(".indicator"); var hasCapital = /[A-Z]/.test(password); var hasNumber = /\d/.test(password); var hasSymbol = /[!@#$%^&*()_+\-=[\]{};':"\\|,.<>/?]/.test(password); capitalCheck.textContent = hasCapital ? '✔' : '✘'; numberCheck.textContent = hasNumber ? '✔' : '✘'; symbolCheck.textContent = hasSymbol ? '✔' : '✘'; capitalCheck.classList.toggle("valid", hasCapital); numberCheck.classList.toggle("valid", hasNumber); symbolCheck.classList.toggle("valid", hasSymbol); }); function calculateTime() { var password = document.getElementById("password").value; var charCount = password.length; var hasUpperCase = /[A-Z]/.test(password); var hasNumber = /\d/.test(password); var hasSymbol = /[!@#$%^&*()_+\-=[\]{};':"\\|,.<>/?]/.test(password); var possibleCharacters = 26 + (hasUpperCase ? 26 : 0) + (hasNumber ? 10 : 0) + (hasSymbol ? 32 : 0); var permutations = Math.pow(possibleCharacters, charCount); var seconds = permutations / 1000000000; var minutes = seconds / 60; var hours = minutes / 60; var days = hours / 24; var years = days / 365; var result = "It would take approximately "; if (years >= 1) { result += Math.floor(years) + " years, " + Math.floor(days % 365) + " days, " + Math.floor(hours % 24) + " hours, " + Math.floor(minutes % 60) + " minutes, and " + Math.floor(seconds % 60) + " seconds to crack this password."; } else if (days >= 1) { result += Math.floor(days) + " days, " + Math.floor(hours % 24) + " hours, " + Math.floor(minutes % 60) + " minutes, and " + Math.floor(seconds % 60) + " seconds to crack this password."; } else if (hours >= 1) { result += Math.floor(hours) + " hours, " + Math.floor(minutes % 60) + " minutes, and " + Math.floor(seconds % 60) + " seconds to crack this password."; } else if (minutes >= 1) { result += Math.floor(minutes) + " minutes, and " + Math.floor(seconds % 60) + " seconds to crack this password."; } else { result += Math.ceil(seconds) + " seconds to crack this password."; } document.getElementById("result").innerText = result; }
内容的提问来源于stack exchange,提问作者Ko1ind
相关产品推荐
相关产品推荐

