Я сократил ваш код до работающего jsFiddle .В коде я вижу несколько прикольных вещей, которые, возможно, сначала нужно разобраться.
Во-первых, кажется, что для этого цикла нет причин, поскольку все, что он делает, это снова и снова запускает один и тот же код с паролем.длина раз:
for(var k = 0; k < password.length; k++){
Вы хотели проверить каждый символ в пароле, по одному в этом цикле?Если это так, то это не то, что делает ваш код.
Что касается ширины, я бы предложил, что самый простой способ - установить ширину контейнера равной максимальной ширине, которую вы хотите, а затем установить ширинуметра в процентах от родительского значения от 0 до 100.
Вот новая версия вашего кода (, работающая здесь в jsFiddle ), пересмотренная множеством способов:
- Изменил ширину красной полосы на процент от ее родительского элемента и ограничил ее на 100%, чтобы она никогда не выходила за пределы родительской ширины.
- Проверьте каждый символ в пароле отдельно
- Установите ширину панели паролей только один раз
- Измените компоновку панели в соответствии с шириной поля ввода
Вот код из новой версии:
function strengthMeter() {
var password = $("newPass").value;
var numEx = /\d/;
var lcEx = /[a-z]/;
var ucEx = /[A-Z]/;
var symbols = ['/', '@', '#', '%', '&', '.', '!', '*', '+', '?', '|','(', ')', '[', ']', '{', '}', '\\'];
var meterMult = 1;
for (var k = 0; k < password.length; k++) {
var pchar = password.charAt(k);
if(numEx.test(pchar)){
meterMult += 0.75;
}
if(ucEx.test(pchar)){
meterMult += 1;
}
if(lcEx.test(pchar)){
meterMult += 0.25;
}
}
for (var i = 0; i < symbols.length; i++) {
if(password.indexOf(symbols[i]) >= 0) {
meterMult += 1;
}
}
// assume that 100% is a meterMult of 15
var fullStrength = 15;
$("meter").style.width = ((Math.min(fullStrength, meterMult)/fullStrength )*100) + "%";
if(meterMult >= 12) {
$("strength").innerHTML = "Strong";
}
else if(password.length >= 6) {
$("strength").innerHTML = "Medium";
}
else {
$("strength").innerHTML = "Weak";
}
}
Очевидно, вы можете настроить вес по своему усмотрению.