checkStrength.js 3.56 KB
/** 
 * 密码强度验证
 * by yangyonghong 
 * 
 */
 define( 'checkStrength', function( require, exports ) {
 	var checkStrength = function( target, options ) {
		this.target = target;
		
		this.opt = {
			minLength: 6, //最小长度
			showClolor:['#ccc','#ff6548','#ff8c00','#5dbc63'],//颜色展示
			strengthText:['','弱','中','强'],//文字展示
			showText:false,//是否显示文字
			showArea:'.show-menu' //颜色展示位置
		};
		
		$.extend( this.opt, options );
		
		this.init();
	};

	checkStrength.prototype = {
		init:function(){
			var _this = this ,
				_target = $( this.target );
			//绑定事件
			_target.bind( 'click , keyup , blur',function(){

				_this.creatColorbar();

				var _level = _this.checkStrong();console.log(_level)
				switch( _level ){
					case 0:
						$( '#s-colorbar1,#s-colorbar2,#s-colorbar3' ).css({ 'background' : _this.opt.showClolor[0]}); 
						break;
					case 1:
						$( '#s-colorbar1' ).css({ 'background' : _this.opt.showClolor[1]})
						.siblings().css({ 'background' : _this.opt.showClolor[0]}); 
						break;
					case 2:
						$( '#s-colorbar1,#s-colorbar2' ).css({ 'background' : _this.opt.showClolor[2]});
						$( '#s-colorbar3' ).css({ 'background' : _this.opt.showClolor[0]}); 
						break;
					case 3:
						$( '#s-colorbar1,#s-colorbar2,#s-colorbar3' ).css({ 'background' : _this.opt.showClolor[3]}); 
						break;
					default:
						$( '#s-colorbar1,#s-colorbar2,#s-colorbar3' ).css({ 'background' : _this.opt.showClolor[3]}); 
						break;				
				}
				if( _this.opt.showText ){
					//$( '.s-strength' ).html( _this.opt.strengthText[_level] );
					for( var i = 1 ; i <= $( '.s-colorbar' ).find( 'span' ).length ; i ++ ){
						$( '#s-colorbar' + i ).html( _this.opt.strengthText[ i ] );
					}
				}
			});		
		},
		//创建颜色展示区域
		creatColorbar:function(){
			var _this = this ,
				_target = $( this.target );
			// if( _this.opt.showText && _target.siblings( '.s-strength' ).length < 1 ){
			// 	var _strength = $( '<div class="s-strength"></div>' );
			// 	_strength.insertAfter( _target );
			// }	

			if( $( _this.opt.showArea ).find( '.s-colorbar' ).length < 1 ){
				var _colorbar = $( '<div class="s-colorbar">\
					<span id="s-colorbar1"></span>\
					<span id="s-colorbar2"></span>\
					<span id="s-colorbar3"></span></div>' );
				_colorbar.appendTo( $( _this.opt.showArea ) );
			}

		},
		//返回密码的强度级别 
		checkStrong:function(){
			var _this = this,
				_target = $( this.target ),
				_val = _target.val(),
				lv = 0;

			if( _val.length < _this.opt.minLength ){//最小长度
				return 0;
				//lv = 0;
			}
			Modes = 0;
			for ( i=0; i<_val.length; i++ ){ 
				//测试每一个字符的类别并统计一共有多少种模式. 
				Modes|= _this.charMode( _val.charCodeAt(i) ); 
			}
			return  _this.bitTotal(Modes);
			// 正则验证 	
			// if( _val.match(/[a-z]/g) ){
			// 	lv++;
			// }
			// if( _val.match(/[0-9]/g) ){
			// 	lv++;
			// }
			// if( _val.match(/(.[^a-z0-9])/g) ){
			// 	lv++;
			// }
			// return lv;
		},
		//测试某个字符是属于哪一类. 
		charMode:function( 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( num ){
			modes=0; 
			for ( i = 0; i < 4; i++ ){ 
				if ( num & 1 ){
					modes++; 
				} 			
				num >>>=1; 
			} 
			return modes; 
		}
	};
	return checkStrength;
 });