Пароль Надежность
Я пытаюсь создать свой собственный измеритель надежности паролей JS.
Это работало раньше, но мне не понравилось, как это работает, поэтому я попытался использовать
{score +=10;}
Вместо просто:
score++
Это мой код: http://jsfiddle.net/RSq4L/
С наилучшими пожеланиями, Шон,
Надеюсь, кто-то может помочь
4 ответа
Несколько вопросов:
- Ваша функция passwordStrength() не была определена в глобальной области видимости в jsFiddle, поэтому ее не вызывали. Вероятно, это артефакт того, как вы настроили jsFiddle, возможно, это не проблема в вашем реальном коде.
- Метод получения соответствующего ratingMsg не будет работать, потому что у вас нет значений массива для каждой возможной оценки, так как многие оценки будут генерировать "undefined" ratingMsg.
- Ваши CSS-классы также немногочисленны, поэтому существует множество значений баллов, которые не будут совпадать ни для одного из них, и не будет действовать соответствующий класс / стиль CSS. Если вам нужен определенный класс для каждого значения рейтинга, то, возможно, вам следует поместить имя класса в массив оценок, чтобы его можно было извлечь из него вместе с рейтингами Msg.
Для первой проблемы, в вашем jsFiddle, вы также должны убедиться, что функция обработки пароля определена в глобальной области видимости. Способ установки вашего jsFiddle - нет (он находится в обработчике загрузки). Вы можете исправить это в jsFiddle, просто установив первый раскрывающийся список в верхнем левом углу на "no wrap (head)".
Для второго выпуска вы используете:
ratingMsg[score]
но ваш массив является разреженным массивом, который не гарантирует наличие записи для большинства возможных результатов. Вы просто не можете сделать это таким образом, потому что многие элементы, к которым вы обращаетесь, будут иметь неопределенные значения, которые не дадут вам значимого сообщения. Например, если бы оценка была 15, вы бы получили доступ к ratingMsg[15], но в этом массиве нет значения в этом пространстве, поэтому вы не получите значимого оценочного сообщения.
Решение состоит в том, чтобы найти другой способ выбрать правильное сообщение. Простейшим способом будет просто оператор if / else if / else if, который проверит, в каком диапазоне находится оценка, и установит соответствующее сообщение. Существуют более элегантные способы, управляемые таблицами, но все они включают поиск в структуре данных, чтобы найти, между какими двумя значениями находится текущий счет, и с использованием этого сообщения.
Если вы посмотрите на этот jsFiddle http://jsfiddle.net/jfriend00/dA7XC/, вы увидите, что ваш код вызывается, но иногда он попадает только в значения в массиве.
И вот переписанный алгоритм, который находит подходящее сообщение независимо от того, какой результат показывают в этой скрипке: http://jsfiddle.net/jfriend00/jYcBT/.
Он использует такую структуру данных:
var ratingMsg = [
0, "Unclassified",
10, "Weak",
20, "Fair",
50, "Better",
60, "Medium",
70, "Good",
90, "Strong"
];
и цикл for вот так, чтобы получить подходящий рейтинг Msg:
for (var i = ratingMsg.length - 2 ; i >= 0; i-=2) {
if (score >= ratingMsg[i]) {
msg = ratingMsg[i+1];
break;
}
}
Вот и вы: http://jsfiddle.net/RSq4L/11/
Первая проблема заключается в том, что в вашей скрипке у вас есть onLoad
опция установлена, так что ваш passwordStrength
функция на самом деле не объявляется в глобальной области видимости. Это объявляется внутри onLoad
блок, с которым jsFiddle оборачивает ваш код. Это приводит к ошибке страницы, когда обработчик нажатия клавиши пытается вызвать функцию.
Вы можете решить эту проблему несколькими различными способами:
- Явно объявив функцию глобальной как в моем примере выше.
- Выбрав один из вариантов jsFiddle "без упаковки" вместо
onLoad
, - Динамически привязывая ваш обработчик событий вместо установки его через элемент
onkeydown
атрибут в разметке.
Вторая проблема заключается в том, как вы набираете сообщения о результатах. У тебя есть:
var ratingMsg = new Array(0);
ratingMsg[0] = "Unclassified";
ratingMsg[10] = "Weak";
ratingMsg[30] = "Fair";
ratingMsg[50] = "Better";
ratingMsg[60] = "Medium";
ratingMsg[70] = "Good";
ratingMsg[90] = "Strong";
... и вы просматриваете сообщение, делая ratingMsg[score]
, Это будет работать только в том случае, если оценка точно соответствует одному из ваших показателей. И исходя из вашей математики, это не всегда будет так.
Я бы предложил сделать что-то вроде:
ratingMsg = {};
ratingMsg[0] = "Unclassified";
ratingMsg[10] = "Weak";
ratingMsg[30] = "Fair";
ratingMsg[50] = "Better";
ratingMsg[60] = "Medium";
ratingMsg[70] = "Good";
ratingMsg[90] = "Strong";
function closestRating(score) {
var bestKey = 0;
var bestMatch = 100;
for (var key in ratingMsg) {
if (key <= score && score - key < bestMatch) {
bestMatch = score - key;
bestKey = key;
}
}
return ratingMsg[bestKey];
}
На несвязанной ноте вы уверены, что хотите использовать onkeydown
? Я думаю onkeyup
будет работать лучше.
В вашем скрипте скрипача было несколько ошибок. Вот исправленный: новый скрипт.
- Вы пропустили точку с запятой здесь: document.getElementById("passwordDescription"). InnerHTML = "" + ratingMsg [score] + ""
- Вы забыли экранировать '^' в своем регулярном выражении
Я только что написал это для этого:Плагин Jquery для принудительной проверки надежности пароля