zoukankan      html  css  js  c++  java
  • 用Javascript评估用户输入密码的强度(Knockout版)

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

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

    原有代码请查看:

    <!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,运行代码查看,一模一样的功能展示出来了。

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

    完整版代码如下:

    <!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>
  • 相关阅读:
    为Internal页面添加一个Unit Test的运行入口
    使用 AWSTATS 来查看IIS/iisnode 日志
    用issnode+IIS来托管NodeJs Server之四:支持Debug
    Restify实践
    Mocha实践
    Graphite实战
    StatsD与Graphite联合作战
    单元测试
    NHibernate配置
    NHibernate概念
  • 原文地址:https://www.cnblogs.com/wuxl360/p/5761080.html
Copyright © 2011-2022 走看看