Пароль Надежность

Я пытаюсь создать свой собственный измеритель надежности паролей JS.

Это работало раньше, но мне не понравилось, как это работает, поэтому я попытался использовать

{score +=10;}

Вместо просто:

score++

Это мой код: http://jsfiddle.net/RSq4L/

С наилучшими пожеланиями, Шон,

Надеюсь, кто-то может помочь

4 ответа

Решение

Несколько вопросов:

  1. Ваша функция passwordStrength() не была определена в глобальной области видимости в jsFiddle, поэтому ее не вызывали. Вероятно, это артефакт того, как вы настроили jsFiddle, возможно, это не проблема в вашем реальном коде.
  2. Метод получения соответствующего ratingMsg не будет работать, потому что у вас нет значений массива для каждой возможной оценки, так как многие оценки будут генерировать "undefined" ratingMsg.
  3. Ваши 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 оборачивает ваш код. Это приводит к ошибке страницы, когда обработчик нажатия клавиши пытается вызвать функцию.

Вы можете решить эту проблему несколькими различными способами:

  1. Явно объявив функцию глобальной как в моем примере выше.
  2. Выбрав один из вариантов jsFiddle "без упаковки" вместо onLoad,
  3. Динамически привязывая ваш обработчик событий вместо установки его через элемент 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] + ""
  • Вы забыли экранировать '^' в своем регулярном выражении
Другие вопросы по тегам