密码强度计

时间:2011-08-03 03:29:00

标签: javascript passwords password-checker

我正在尝试创建自己的JS密码强度计。

之前有效,但我不喜欢它是如何工作的所以我尝试使用

{score +=10;}

而不仅仅是:

score++

这是我的代码: http://jsfiddle.net/RSq4L/

最诚挚的问候, 肖恩,

希望有人可以提供帮助

3 个答案:

答案 0 :(得分:4)

多个问题:

  1. 您的passwordStrength()函数未在jsFiddle的全局范围中定义,因此未被调用。这可能是你如何设置jsFiddle的一个神器,也许不是你真实代码中的问题。
  2. 获取适当ratingMsg的方法将不起作用,因为您没有每个可能得分的数组值,因此很多分数将生成“未定义”ratingMsg。
  3. 您的CSS类也很稀疏,因此有许多得分值,它们也不匹配,并且没有合适的CSS类/样式。如果你想为每个评级值设置一个特定的类,那么你可能应该将classname放在评级数组中,以便可以从那里获取ratingMsg。
  4. 对于第一个问题,在jsFiddle中,您还必须确保在全局范围内定义了密码处理功能。你的jsFiddle的设置方式,它不是(它在onload处理程序中)。您只需将左上角的第一个下拉菜单设置为“no wrap(head)”即可在jsFiddle中修复此问题。

    对于第二个问题,您正在使用:

    ratingMsg[score]
    

    但是,你的数组是一个稀疏数组,不能保证有大多数可能分数的条目。您根本无法这样做,因为您访问的许多元素将具有未定义的值,这些值不会给您带来有意义的消息。例如,如果得分为15,您将访问ratingMsg [15],但数组中的该空间没有值,因此您将无法获得有意义的评级消息。

    解决方案是找到一种不同的方法来选择正确的消息。最简单的方法就是if / else if / else if语句,它将检查得分所在的范围并设置适当的msg。有更优雅的表格驱动方式,但所有都将涉及搜索数据结构,以找出当前得分在两个值和使用该消息之间的两个值。

    如果你看一下这个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循环得到适当的ratingMsg:

      for (var i = ratingMsg.length - 2 ; i >= 0; i-=2) {
          if (score >= ratingMsg[i]) {
              msg = ratingMsg[i+1];
              break;
          }
      }
    

答案 1 :(得分:2)

在这里:http://jsfiddle.net/RSq4L/11/

第一个问题是,在你的小提琴中你设置了onLoad选项,所以你的passwordStrength函数实际上并没有在全局范围内声明。它是在jsFiddle包装你的代码的onLoad块内声明的。当按键处理程序尝试调用该函数时,这会导致页面出错。

您可以通过多种不同方式解决此问题:

  1. 根据上面的示例明确声明该函数为全局函数。
  2. 选择jsFiddle中的一个“no wrap”选项而不是onLoad
  3. 通过动态绑定事件处理程序,而不是通过标记中元素的onkeydown属性进行设置。
  4. 第二个问题是你如何键入你的分数信息。你有:

    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会更好。

答案 2 :(得分:0)

你的小提琴脚本有几个错误。以下是更正后的问题:new script

  • 你错过了一个分号:document.getElementById(“passwordDescription”)。innerHTML =“”+ ratingMsg [score] +“
  • 你忘了逃避正则表达式上的'^'