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

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

0 голосов
/ 03 августа 2011

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

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

{score +=10;}

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

score++

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

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

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

Ответы [ 3 ]

4 голосов
/ 03 августа 2011

Несколько выпусков:

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

Вот, пожалуйста: 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 будет работать лучше.

0 голосов
/ 03 августа 2011

В вашем скрипте fiddler было несколько ошибок.Вот исправленный: новый скрипт .

  • Здесь вы пропустили точку с запятой: document.getElementById ("passwordDescription"). InnerHTML = "" + ratingMsg [score] + ""
  • Вы забыли экранировать '^' в своем регулярном выражении
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...