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