以下是 jQuery密码强度插件Power PWChecker js代码 的示例演示效果:
部分效果截图:

HTML代码(index.html):
<!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>jQuery密码强度插件Power PWChecker</title>
    <script src="js/jquery-1.4.4.min.js" type="text/javascript"></script>
    <link href="style/demo.css" rel="stylesheet" type="text/css" />
    <link href="style/style.css" rel="stylesheet" type="text/css" />
    <script src="js/pschecker.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(document).ready(function () {
           
            //Demo code
            $('.password-container').pschecker({ onPasswordValidate: validatePassword, onPasswordMatch: matchPassword });
            var submitbutton = $('.submit-button');
            var errorBox = $('.error');
            errorBox.css('visibility', 'hidden');
            submitbutton.attr("disabled", "disabled");
            //this function will handle onPasswordValidate callback, which mererly checks the password against minimum length
            function validatePassword(isValid) {
                if (!isValid)
                    errorBox.css('visibility', 'visible');
                else
                    errorBox.css('visibility', 'hidden');
            }
            //this function will be called when both passwords match
            function matchPassword(isMatched) {
                if (isMatched) {
                    submitbutton.addClass('unlocked').removeClass('locked');
                    submitbutton.removeAttr("disabled", "disabled");
                }
                else {
                    submitbutton.attr("disabled", "disabled");
                    submitbutton.addClass('locked').removeClass('unlocked');
                }
            }
        });
    </script>
</head>
<body>
    <div class="wrapper">
        <div class="logo">
            <img src="images/logo.jpg" alt="logo" /></div>
        <p>
            <span class="error">Password must be 8 characters long</span>
        </p>
        <div class="password-container">
            <p>
                <label>
                    Enter Password:</label>
                <input class="strong-password" type="password" />
            </p>
            <p>
                <label>
                    Confirm Password:</label>
                <input class="strong-password" type="password" />
            </p>
            <p>
                <a class="submit-button locked" href="#">Submit</a>
            </p>
            <div class="strength-indicator">
                <div class="meter">
                </div>
                Strong passwords contain 8-16 characters, do not include common words or names,
                and combine uppercase letters, lowercase letters, numbers, and symbols.
            </div>
        </div>
    </div>  
	</body>
</html>
JS代码(pschecker.js):
(function ($){
	$.fn.extend({
	pschecker:function (options){
	var settings = $.extend({
	minlength:8,maxlength:16,onPasswordValidate:null,onPasswordMatch:null}
,options);
	return this.each(function (){
	var wrapper = $('.password-container');
	var password = $('.strong-password:eq(0)',wrapper);
	var cPassword = $('.strong-password:eq(1)',wrapper);
	cPassword.removeClass('no-match');
	password.keyup(validatePassword).blur(validatePassword).focus(validatePassword);
	cPassword.keyup(validatePassword).blur(validatePassword).focus(validatePassword);
	function validatePassword(){
	var pstr = password.val().toString();
	var meter = $('.meter');
	meter.html("");
	//fires password validate event if password meets the min length requirement if (settings.onPasswordValidate != null) settings.onPasswordValidate(pstr.length >= settings.minlength);
	if (pstr.length < settings.maxlength) meter.removeClass('strong').removeClass('medium').removeClass('week');
	if (pstr.length > 0){
	var rx = new RegExp(/^(?=(.*[a-z]){
	1,}
)(?=(.*[\d]){
	1,}
)(?=(.*[\W]){
	1,}
)(?!.*\s).{
	7,30}
$/);
	if (rx.test(pstr)){
	meter.addClass('strong');
	meter.html("Strong");
}
else{
	var alpha = containsAlpha(pstr);
	var number = containsNumeric(pstr);
	var upper = containsUpperCase(pstr);
	var special = containsSpecialCharacter(pstr);
	var result = alpha + number + upper + special;
	if (result > 2){
	meter.addClass('medium');
	meter.html("Medium");
}
else{
	meter.addClass('week');
	meter.html("Week");
}
}
if (cPassword.val().toString().length > 0){
	if (pstr == cPassword.val().toString()){
	cPassword.removeClass('no-match');
	if (settings.onPasswordMatch != null) settings.onPasswordMatch(true);
}
else{
	cPassword.addClass('no-match');
	if (settings.onPasswordMatch != null) settings.onPasswordMatch(false);
}
}
else{
	cPassword.addClass('no-match');
	if (settings.onPasswordMatch != null) settings.onPasswordMatch(false);
}
}
}
function containsAlpha(str){
	var rx = new RegExp(/[a-z]/);
	if (rx.test(str)) return 1;
	return 0;
}
function containsNumeric(str){
	var rx = new RegExp(/[0-9]/);
	if (rx.test(str)) return 1;
	return 0;
}
function containsUpperCase(str){
	var rx = new RegExp(/[A-Z]/);
	if (rx.test(str)) return 1;
	return 0;
}
function containsSpecialCharacter(str){
	var rx = new RegExp(/[\W]/);
	if (rx.test(str)) return 1;
	return 0;
}
}
);
}
}
);
}
)(jQuery);
	CSS代码(demo.css):
body{background-color:#232A34;padding-top:50px;font-family:Arial,Helvetica,sans-serif;font-size:12px;}
.wrapper{width:840px;height:300px;margin:auto;background-color:#fff;border-radius:8px;-moz-border-radius:8px;-webkit-border-radius:8px;}
.logo{height:40px;padding:30px 30px 0px 30px;}
.error{color:Red;display:block;margin-left:132px;}
.submit-button{width:74px;height:20px;display:block;margin-left:312px;}
a.submit-button{text-decoration:none;color:#282834;font-size:18px;}
.locked{background-image:url(../images/locked.jpg);background-position:right;background-repeat:no-repeat;}
.unlocked{background-image:url(../images/unlocked.jpg);background-position:right;background-repeat:no-repeat;}
 
             
        