• 用Javascript评估用户输入密码的强度(Knockout版)


    早上看到博友6点多发的一篇关于密码强度的文章(连接),甚是感动(周末大早上还来发文)。

    我们来看看如果使用Knockout更简单的来实现密码强度的验证。

    原有代码请查看:

    View Code
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <title></title>
    </head>
    <body>
    <script type="text/javascript">
    //CharMode函数
    function CharMode(iN) {
    if (iN >=48&& iN <=57) //数字
    return1;
    if (iN >=65&& iN <=90) //大写字母
    return2;
    if (iN >=97&& iN <=122) //小写
    return4;
    else
    return8; //特殊字符
    }

    //bitTotal函数
    function bitTotal(num) {
    modes
    =0;
    for (i =0; i <4; i++) {
    if (num &1) modes++;
    num
    >>>=1;
    }
    return modes;
    }

    //checkStrong函数
    function checkStrong(sPW) {
    if (sPW.length <=4)
    return0; //密码太短
    Modes =0;
    for (i =0; i < sPW.length; i++) {
    Modes
    |= CharMode(sPW.charCodeAt(i));
    }
    return bitTotal(Modes);
    }


    //pwStrength函数
    function pwStrength(pwd) {
    O_color
    ="#eeeeee";
    L_color
    ="#FF0000";
    M_color
    ="#FF9900";
    H_color
    ="#33CC00";
    if (pwd ==null|| pwd =='') {
    Lcolor
    = Mcolor = Hcolor = O_color;
    }
    else {
    S_level
    = checkStrong(pwd);
    switch (S_level) {
    case0:
    Lcolor
    = Mcolor = Hcolor = O_color;
    case1:
    Lcolor
    = L_color;
    Mcolor
    = Hcolor = O_color;
    break;
    case2:
    Lcolor
    = Mcolor = M_color;
    Hcolor
    = O_color;
    break;
    default:
    Lcolor
    = Mcolor = Hcolor = H_color;
    }

    document.getElementById(
    "strength_L").style.background = Lcolor;
    document.getElementById(
    "strength_M").style.background = Mcolor;
    document.getElementById(
    "strength_H").style.background = Hcolor;
    return;
    }
    }
    </script>
    <form name="form1" action="">
    输入密码:<input type="password" size="10" onkeyup="pwStrength(this.value)" onblur="pwStrength(this.value)">
    <br>
    密码强度:
    <table width="217" border="1" cellspacing="0" cellpadding="1" bordercolor="#cccccc"
    height
    ="23" style='display: inline'>
    <tr align="center" bgcolor="#eeeeee">
    <td width="33%" id="strength_L">

    </td>
    <td width="33%" id="strength_M">

    </td>
    <td width="33%" id="strength_H">

    </td>
    </tr>
    </table>
    </form>
    </body>
    </html>

    首先我们来改善一下上面博友的验证函数为如下代码:

    var Page = Page || {};
    Page.Utility = Page.Utility || {};
    Page.Utility.Registration = Page.Utility.Registration || {};

    //获取密码强度
    Page.Utility.Registration.getPasswordLevel = function (password) {
    if (password == null || password == '')
    return 0;

    if (password.length <= 4)
    return 0; //密码太短

    var Modes = 0;
    for (i = 0; i < password.length; i++) {
    Modes |= CharMode(password.charCodeAt(i));
    }
    return bitTotal(Modes);

    //CharMode函数
    function CharMode(iN) {
    if (iN >= 48 && iN <= 57) //数字
    return 1;
    if (iN >= 65 && iN <= 90) //大写字母
    return 2;
    if (iN >= 97 && iN <= 122) //小写
    return 4;
    else
    return 8; //特殊字符
    }

    //bitTotal函数
    function bitTotal(num) {
    modes = 0;
    for (i = 0; i < 4; i++) {
    if (num & 1) modes++;
    num >>>= 1;
    }
    return modes;
    }
    };

    然后来创建View Model,但是引用Knockout之前,我们首先要引用Knockout的Js类库(具体介绍请查看Knockout应用开发指南的系列教程)
    View model代码如下:

    var viewModel = {
    Password: ko.observable(""),
    Ocolor: "#eeeeee"
    };

    对于密码强度以及颜色的值依赖于密码字符串的值,所以我们需要为他们声明依赖属性,代码如下:

    viewModel.PasswordLevel = ko.dependentObservable(function () {
    return Page.Utility.Registration.getPasswordLevel(this.Password());
    }, viewModel);

    viewModel.Lcolor = ko.dependentObservable(function () {
    //根据密码强度判断第一个格显示的背景色
    return this.PasswordLevel() == 0 ? this.Ocolor : (this.PasswordLevel() == 1 ? "#FF0000" : (this.PasswordLevel() == 2 ? "#FF9900" : "#33CC00"))
    }, viewModel);

    viewModel.Mcolor = ko.dependentObservable(function () {
    //根据密码强度判断第二个格显示的背景色
    return this.PasswordLevel() < 2 ? this.Ocolor : (this.PasswordLevel() == 2 ? "#FF9900" : "#33CC00")
    }, viewModel);

    viewModel.Hcolor = ko.dependentObservable(function () {
    //根据密码强度判断第三个格显示的背景色
    return this.PasswordLevel() < 3 ? this.Ocolor : "#33CC00"
    }, viewModel);

    然后使用applyBindings方法将view model绑定到该页面,你可以使用jQuery的ready函数来执行该绑定代码,也可以在页面最下方执行绑定代码,我们这里使用了jQuery,代码如下:

    $((function () {
    ko.applyBindings(viewModel);
    }));

    最后,我们再看看这些值怎么动态绑定到HTML元素上的,请查看如下代码(其中使用了afterkeydown代替了onKeyUp和onBlur):

    <form name="form1" action="">
    输入密码:
    <
    input type="text" size="10" data-bind="value:Password, valueUpdate: 'afterkeydown'">
    <br>
    密码强度:
    <table width="217" border="1" cellspacing="0" cellpadding="1" bordercolor="#cccccc"
    height
    ="23" style='display: inline'>
    <tr align="center" bgcolor="#eeeeee">
    <td width="50"data-bind="style: { backgroundColor: Lcolor }"></td>
    <td width="50"data-bind="style: { backgroundColor: Mcolor }"></td>
    <td width="50"data-bind="style: { backgroundColor: Hcolor }"></td>
    </tr>
    </table>
    </form>

    然后就OK,运行代码查看,一模一样的功能展示出来了。

    如果去掉为验证而改善的代码,总代码肯定是比原有的方式少的。

    完整版代码如下:

    View Code
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    <html>
    <head>
    <script type="text/javascript" src="http://knockoutjs.com/js/jquery-1.4.2.min.js"></script>
    <script type="text/javascript" src="http://knockoutjs.com/js/jquery.tmpl.js"></script>
    <script type="text/javascript" src="http://knockoutjs.com/js/knockout-1.2.1.js"></script>
    </head>
    <body>
    <script type="text/javascript">
    var Page = Page || {};
    Page.Utility
    = Page.Utility || {};
    Page.Utility.Registration
    = Page.Utility.Registration || {};

    //获取密码强度
    Page.Utility.Registration.getPasswordLevel =function (password) {
    if (password ==null|| password =='')
    return0;

    if (password.length <=4)
    return0; //密码太短

    var Modes =0;
    for (i =0; i < password.length; i++) {
    Modes
    |= CharMode(password.charCodeAt(i));
    }
    return bitTotal(Modes);

    //CharMode函数
    function CharMode(iN) {
    if (iN >=48&& iN <=57) //数字
    return1;
    if (iN >=65&& iN <=90) //大写字母
    return2;
    if (iN >=97&& iN <=122) //小写
    return4;
    else
    return8; //特殊字符
    }

    //bitTotal函数
    function bitTotal(num) {
    modes
    =0;
    for (i =0; i <4; i++) {
    if (num &1) modes++;
    num
    >>>=1;
    }
    return modes;
    }
    };

    var viewModel = {
    Password: ko.observable(
    ""),
    Ocolor:
    "#eeeeee"
    };

    viewModel.PasswordLevel
    = ko.dependentObservable(function () {
    return Page.Utility.Registration.getPasswordLevel(this.Password());
    }, viewModel);

    viewModel.Lcolor
    = ko.dependentObservable(function () {
    //根据密码强度判断第一个格显示的背景色
    returnthis.PasswordLevel() ==0?this.Ocolor : (this.PasswordLevel() ==1?"#FF0000" : (this.PasswordLevel() ==2?"#FF9900" : "#33CC00"))
    }, viewModel);

    viewModel.Mcolor
    = ko.dependentObservable(function () {
    //根据密码强度判断第二个格显示的背景色
    returnthis.PasswordLevel() <2?this.Ocolor : (this.PasswordLevel() ==2?"#FF9900" : "#33CC00")
    }, viewModel);

    viewModel.Hcolor
    = ko.dependentObservable(function () {
    //根据密码强度判断第二个格显示的背景色
    returnthis.PasswordLevel() <3?this.Ocolor : "#33CC00"
    }, viewModel);

    $((
    function () {
    ko.applyBindings(viewModel);
    }));


    </script>
    <form name="form1" action="">
    输入密码:<input type="text" size="10" data-bind="value:Password, valueUpdate: 'afterkeydown'">
    <br>
    密码强度:
    <table width="217" border="1" cellspacing="0" cellpadding="1" bordercolor="#cccccc"
    height
    ="23" style='display: inline'>
    <tr align="center" bgcolor="#eeeeee">
    <td width="50" id="strength_L" data-bind="style: { backgroundColor: Lcolor }">

    </td>
    <td width="50" id="strength_M" data-bind="style: { backgroundColor: Mcolor }">

    </td>
    <td width="50" id="strength_H" data-bind="style: { backgroundColor: Hcolor }">

    </td>
    </tr>
    </table>
    </form>
    </body>
    </html>
  • 相关阅读:
    大型网站架构演化发展历程
    用Haproxy给MySQL做负载均衡
    一致性hash和虚拟节点
    Apache + Tomcat +mod_jk 实现集群
    浅谈时钟的生成(js手写代码)
    javascript
    vue-cli中安装方法
    webstorm激活
    解决webstorm卡顿问题
    gulp前端自动化环境搭建详解
  • 原文地址:https://www.cnblogs.com/TomXu/p/2264876.html
Copyright © 2020-2023  润新知