1 /**
  2  * 字符限制(默认140字)
  3  * @constructor
  4  * @author putaoshu@126.com
  5  * @date 2012-03-13
  6  * @param {Object} options 组件配置
  7  * @param {Number} options.max 140 字符数
  8  * @param {String} options.numClass 数字显示class
  9  * @param {String} options.btnClass 提交按钮class
 10  * @param {String} options.errorClass 提示错误的class
 11  * @example 
 12 $("#nickname").maxLength({
 13 	max:140,
 14 	numClass : 'num',
 15 	btnClass : 'btn',
 16 	errorClass : 'error'
 17 });
 18 
 19  */
 20 vui.maxlength = vui.maxLength = function(options){
 21 	var $this = $(this);
 22 
 23 	options = $.extend({
 24 		maxCharacters : 140,
 25 		numClass : 'num',
 26 		btnClass : 'btn',
 27 		errorClass : 'W_error'
 28 	},options)
 29 
 30 	var $num = $('.'+options.numClass);
 31 	var $btn = $('.'+options.btnClass);
 32 
 33 	/**
 34 	 * 字符串长度处理(长度1:2字母=1汉字)
 35 	 * @param {String} str 需要进行处理的字符串
 36 	 * @return {Number} 返回长度
 37 	 * @example
 38 		var nStrLength = getLength("中");	//return 1
 39 		var nStrLength = getLength("aa");	//return 1
 40 	 */
 41 	function getLength(str){		
 42 		var regexp = new RegExp('(http://)+(([-A-Za-z0-9]+(\.[-A-Za-z0-9]+)*(\.[-A-Za-z]{2,5}))|([0-9]{1,3}(\.[0-9]{1,3}){3}))(:[0-9]*)?(/[-A-Za-z0-9_\$\.\+\!\*\(\),;:@&=\?/~\#\%]*)*', 'gi')
 43 		var len = str.length;
 44 		if (len > 0){
 45 			var min=41,max=140,tmp=str;
 46 			var urls = str.match(regexp) || [];
 47 			var urlCount = 0;
 48 			for(var i=0,len=urls.length;i<len;i++){
 49 				var count = byteLength(urls[i]);
 50 				if(count>min){
 51 					urlCount += count<=max?21:(21+ (count-max)/2);
 52 					tmp = tmp.replace(urls[i],'');
 53 				}
 54 			};
 55 			return Math.ceil(urlCount + byteLength(tmp) / 2)
 56 		}else{
 57 			return 0;
 58 		}
 59 	};
 60 
 61 	/**
 62 	 * 将unicode字符计算为2个
 63 	 * @param {String} str 需要进行处理的字符串
 64 	 * @return {Number} 返回长度
 65 	 * @for byteLength
 66 	 * @example
 67 		var nStrLength = Core.String.byteLength("中");	//return 2
 68 	 */
 69 	function byteLength(str){
 70 		if(typeof str == "undefined"){
 71 			return 0;
 72 		}
 73 		var aMatch = str.match(/[^\x00-\x80]/g);
 74 		return (str.length + (!aMatch ? 0 : aMatch.length));
 75 	};
 76 	
 77 	
 78 	function maxlength(){
 79 		 var $thisLength = getLength($this.val());
 80 		
 81 		if($thisLength > options.maxCharacters){
 82 			$num.html('<em>已超过</em><span class="errorNum">' + ($thisLength-options.maxCharacters) +'</span><em>字</em>' );
 83 			$('span',$num).addClass(options.errorClass);
 84 			$btn.attr('disabled','disabled');
 85 		}else{
 86 			$num.html('<em>还可以输入</em>' + (options.maxCharacters - $thisLength)  +'<em>字</em>');
 87 			$('span',$num).removeClass(options.errorClass);
 88 			$btn.attr('disabled','');
 89 		}
 90 
 91 		if($thisLength == 0){
 92 			$btn.attr('disabled','disabled');
 93 		}
 94 	}
 95 
 96 	//初始化
 97 	maxlength();
 98 
 99 	$this.keyup(function(){
100 		maxlength();
101 	});
102 
103 };
104 
105