Code/** * Created by LT on 2013/6/16. * Common.js * 对原生JS对象的扩展 * Object、Array、String、Date、Ajax、Cookie */;(function(){Object.extend =function(targetObj,fnJson){ for(var fnName in fnJson){ targetObj[fnName]=fnJson[fnName]; } return targetObj;};/** * 对Object的扩展 */Object.extend(Object.prototype,{ values: function() { // 一个静态方法, 传入一个对象, 返回该对象中所有属性所对应的值, 构成数组返回 var values = []; for (var property in this) values.push(this[property]); // 将每个属性的值压入到一个数组中 return values; }, clone: function(object) { // 一个静态方法, 传入一个对象, 克隆一个新对象并返回 return Object.extend({}, object); }, getType:function(){ return Object.prototype.toString.call(this).match(/\[object (.*?)\]/)[1].toLowerCase(); }, toJson:function(){ return JSON.stringify(this); }, serialize:function(){ if(JSON.parse) return JSON.parse(this); switch(this.constructor){ case Object: var str = "{"; for(var o in obj){ str += ‘"‘+o + ‘"‘+ ":" + Serialize(obj[o]) +","; } if(str.substr(str.length-1) == ",") str = str.substr(0,str.length -1); return str + "}"; break; case Array: var str = "{"; if(str.substr(str.length-1) == ",") { str = str.substr(0, str.length - 1); } for(var o in obj){ str += ‘"‘+o + ‘"‘+ ":"+Serialize(obj[o]) +","; } return str + "}"; break; case Boolean: return "\"" + obj.toString() + "\""; break; case Date: return "\"" + obj.toString() + "\""; break; case Function: break; case Number: return "\"" + obj.toString() + "\""; break; case String: return "\"" + obj.toString() + "\""; break; } }});/** * 对Array的扩展 */Object.extend(Array.prototype,{ clear:function(){ this.length=0; return this; }, lastIndexOfArr:function(obj){ if(this.lastIndexOf(obj)){ return this.lastIndexOf(obj); }else{ this.reverse(); return this.length-1-this.indexOfArr(obj); } }, contain:function(obj){ return this.indexOfArr(obj)>-1; }, insertAt:function(index,obj){ this.splice(index,0,obj); return this; }, removeAt:function(index){ this.splice(index,1); return this; }, first:function(){ return this[0]; }, indexOfArr:function(obj){ //如果浏览器支持原生的indexOf,则调用原生的方法 if(this.indexOf){ return this.indexOf(obj); }else{ var i=0;len=this.length; for(i;i<len;i++){ if(this[i]==obj) return i; return -1; } } }, last:function(){ return this[this.length-1]; }, distinct:function(){ this.sort(); var res=[this[0]]; for(var i = 1; i < this.length; i++) { if( this[i] !== res[res.length-1]) { res.push(this[i]); } } return res; }, sumNum:function(){ if(this.reduce){ return this.reduce(function(partial,value){ return partial+value; }) }else{ return eval(arr.join(‘+‘)); } }, sortNumAsc:function(){ this.sort(function(a,b){ return a-b; }); return this; }, sortNumDesc:function(){ this.sort(function(a,b){ return b-a; }); return this; }, maxNum:function(){ return this.sortNumAsc()[this.length-1]; }, minNum:function(){ return this.sortNumAsc()[0]; }, toUpperCase:function(){ if(this.map){ return this.map.call(this,function(elem){ return elem.toUpperCase(); }) }else{ return this.toLocaleString().toUpperCase().split(‘,‘); } }, toLowerCase:function(){ if(this.map){ return this.map.call(this,function(elem){ return elem.toLowerCase(); }) }else{ return this.toLocaleString().toLowerCase().split(‘,‘); } }})/** * 对String的扩展 */Object.extend(String.prototype,{ /* *使用示例如下 *var s = String.format("S{0}T{1}","n","e");//结果:SnTe */ format:function(){ var res = arguments[0]; for(var i= 0,len=arguments.length-1; i<len; i++){ var b=new Regexp("\\{"+i+"\\","gm"); res= res.replace(b,arguments[i+1]); } return res; }, append:function(str){ return this.concat(str); }, leftpad:function(len,str){ if(arguments.length===1) str=‘0‘; var res = new StringBuilder(); for (var i= 0,c=len-this.length; i<c; i++){ res.append(str); } res.append(this); return res.toString(); }, rightpad:function(len, str){ if(arguments.length===1) str=‘0‘; var res = new StringBuilder(); res.append(this); for (var i= 0,c=len-this.length; i<c; i++){ res.append(str); } return res.toString(); }, trim:function(){ return this.replace(/(^\s+)|(\s+$)/g,‘‘); }, ltrim:function(){ return this.replace(/^\s+/g,‘‘); }, rtrim:function(){ return this.replace(/\s+$/g,‘‘); }, startWith:function(str,ignorCase){ if(str.length>this.length)return false; if(ignorCase){ return this.toLowerCase().indexOf(str.toLowerCase())===0; }else{ return this.indexOf(str)===0; } }, endWith:function(str,ignorCase){ if(str.length>this.length)return false; if(ignorCase){ return this.toLowerCase().lastIndexOf(str.toLowerCase())===this.length-str.length; }else{ return this.lastIndexOf(str)===this.length-str.length; } }, removeCharAt:function(index){ if (index < 0 || index >= this.length) { return this.valueOf(); } else if (index == 0) { return this.substring(1, this.length); } else if (index == this.length - 1) { return this.substring(0, this.length - 1); } else { return this.substring(0, index) + this.substring(index + 1); } }, removeStr:function(start,end){ if (start == end) { return this.deleteCharAt(start); } else { if (start > end) { var temp = start; start = end; end = temp; } if (start < 0) { start = 0; } if (end > this.length - 1) { end = this.length - 1; } return this.substring(0, start) + this.substring(end +1 , this.length); } }, equalIgnoreCase:function(str){ return this.toLowerCase()===str.toLowerCase(); }, insertAfter:function(index,str){ return this.slice(0,index+1)+str+this.slice(index+1); }, insertBefore:function(index,str){ return this.slice(0,index)+str+this.slice(index); }, isAllNumber:function(){ for (var i = 0; i < this.length; i++) { if (this.charAt(i) < ‘0‘ || this.charAt(i) > ‘9‘) { return false; } } return true; }, isInt:function(){ return /^[1-9]\d$/.test(this); }, isNullOrEmpty:function(){ if(this===null||this.trim()===""){ return true; } return false; }, isPhoneNum:function(){ var pattern = /^0{0,1}(13[0-9]|14[6|7]|15[0-3]|15[5-9]|18[0-3]|18[5-9])[0-9]{8}$/; return pattern.test(this); }, getCharLength:function(){ var temp = 0; for (var i = 0; i < this.length; i++) { if (this.charCodeAt(i) > 255) { temp += 2; } else { temp += 1; } } return temp; }, getNum:function(){ return this.replace(/[^d]/g, ""); }, getEn:function(){ return this.replace(/[^A-Za-z]/g, ""); }, getCn:function(){ return this.replace(/[^u4e00-u9fa5uf900-ufa2d]/g, ""); }, left:function(n){ return this.slice(0, n); }, right:function(n){ return this.slice(this.length - n); }, encodeHTML:function(){ if(this.isNullOrEmpty()) return this; var str = this; str=str.replace(/&/g,"&"); str=str.replace(/</g,"<"); str=str.replace(/>/g,">"); str=str.replace(/\‘/g,"'"); str=str.replace(/\"/g,"""); str=str.replace(/\t/g," "); str=str.replace(/\s+/g," "); str=str.replace(/\s/g," "); str=str.replace(/\n/g,"&BR"); return str; }, decodeHTML:function(){ if(this.isNullOrEmpty()) return this; var str = this; str=str.replace(/&/g,"&"); str=str.replace(/</g,"<"); str=str.replace(/>/g,">"); str=str.replace(/'/g,"\‘"); str=str.replace(/"/g,"\""); str=str.replace(/ /g,"\t"); str=str.replace(/ /g," "); str=str.replace(/&BR/g,"\r\n"); return str; }, truncate:function(len,str){ if(this.length<=len){ return this; }else{ return this.substring(0,len)+str; } }, getUrlQuery:function(name){ var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); var r = this.substr(this.indexOf("\?") + 1).match(reg); if (r != null) return unescape(r[2]); return null; }, appendUrlPram:function(name,val){ var index = this.indexOf(name + ‘=‘); if (index > 0) { var endPos = this.indexOf(‘&‘, index); if (endPos > index) return this.replace(‘/‘ + this.substr(index, endPos - index) + ‘/‘, name + ‘=‘ + val); else return this.substr(0, index) + name + ‘=‘ + val; } else return this.indexOf(‘?‘) > 0 ? (this + ‘&‘ + name + ‘=‘ + val) : (this + ‘?‘ + name + ‘=‘ + val); }});/** * 添加StringBuilder类,提高对字符串操作的效率 */function StringBuilder(str){ this._strings= new Array(); this.append(str);}Object.extend(StringBuilder.prototype,{ append:function(str){ this._strings.push(a); return this; }, toString:function(){ var a = (arguments.length==0)?"":arguments[0]; return this._strings.join(a); }});/** * 对Date的扩展方法 */Object.extend(Date.prototype,{ format:function(formatStr){ var o = { ‘M+‘:this.getMonth()+1,//月 ‘d+‘:this.getDate(),//日 ‘h+‘:this.getHours(),//小时 ‘m+‘:this.getMinutes(),//分 ‘s+‘:this.getSeconds(),//秒 ‘q+‘:Math.floor((this.getMonth()+3)/3),//季度 ‘S‘:this.getMilliseconds() //毫秒 } if(/(y+)/.test(formatStr)){ formatStr = formatStr.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); } for(var k in o){ if (new RegExp("(" + k + ")").test(fomartStr)) formatStr = formatStr.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); return formatStr; } }, addDays:function(num){ this.setDate(this.getDate+num); return this; }, addWeeks:function(num){ return this.addDays(num*7); }, addMonths:function(num){ var d = this.getDate(); this.setMonth(this.getMonth()+num); if(this.getDate<d){ this.setDate(0); } return this; }, addYears:function(num){ var m = this.getMonth(); this.setFullYear(this.getFullYear()+num); if(m<this.getMonth()){ this.setDate(0); } return this; }, isValiDate:function(dateStr,formatStr){ if(!dateStr){ return false; } if(!formatStr){ formatStr = "yyyy-MM-dd";//默认格式:yyyy-MM-dd } if(dateStr.length!=formatStr.length){ return false; }else{ if(formatStr=="yyyy-MM-dd"||formatStr=="YYYY-MM-DD"){ var r1=/^(((((([02468][048])|([13579][26]))(00))|(d{2}(([02468][48])|([13579][26]))))-((((0[13578])|(1[02]))-(([0-2][0-9])|(3[01])))|(((0[469])|(11))-(([0-2][0-9])|(30)))|(02-([0-2][0-9]))))|(d{2}(([02468][1235679])|([13579][01345789]))-((((0[13578])|(1[02]))-(([0-2][0-9])|(3[01])))|(((0[469])|(11))-(([0-2][0-9])|(30)))|(02-(([0-1][0-9])|(2[0-8]))))))$/; return r1.test(dateStr); }else if(formatStr=="yyyy/MM/dd"||formatStr=="YYYY/MM/DD"){ var r2=/^(((((([02468][048])|([13579][26]))(00))|(d{2}(([02468][48])|([13579][26]))))\/((((0[13578])|(1[02]))\/(([0-2][0-9])|(3[01])))|(((0[469])|(11))\/(([0-2][0-9])|(30)))|(02\/([0-2][0-9]))))|(d{2}(([02468][1235679])|([13579][01345789]))\/((((0[13578])|(1[02]))\/(([0-2][0-9])|(3[01])))|(((0[469])|(11))\/(([0-2][0-9])|(30)))|(02\/(([0-1][0-9])|(2[0-8]))))))$/; return r2.test(dateStr); }else if(formatStr=="MM-dd-yyyy"||formatStr=="MM-DD-YYYY"){ var r3=/^((((((0[13578])|(1[02]))-(([0-2][0-9])|(3[01])))|(((0[469])|(11))-(([0-2][0-9])|(30)))|(02-([0-2][0-9])))-(((([02468][048])|([13579][26]))(00))|(d{2}(([02468][48])|([13579][26])))))|(((((0[13578])|(1[02]))-(([0-2][0-9])|(3[01])))|(((0[469])|(11))-(([0-2][0-9])|(30)))|(02-(([0-1][0-9])|(2[0-8])))))-d{2}(([02468][1235679])|([13579][01345789])))$/; return r3.test(dateStr); }else if(formatStr=="MM/dd/yyyy"||formatStr=="MM/DD/YYYY"){ var r4=/^((((((0[13578])|(1[02]))\/(([0-2][0-9])|(3[01])))|(((0[469])|(11))\/(([0-2][0-9])|(30)))|(02\/([0-2][0-9])))\/(((([02468][048])|([13579][26]))(00))|(d{2}(([02468][48])|([13579][26])))))|(((((0[13578])|(1[02]))\/(([0-2][0-9])|(3[01])))|(((0[469])|(11))\/(([0-2][0-9])|(30)))|(02\/(([0-1][0-9])|(2[0-8])))))\/d{2}(([02468][1235679])|([13579][01345789])))$/; return r4.test(dateStr); }else{// throw new Error(‘日期格式不正确‘); return false; } } return false; }, isValiTime:function(timeStr, formatStr){ if(!timeStr){ return false; } if(!formatStr){ formatStr = "hh:mm:ss";//默认格式:hh:mm:ss } if(timeStr.length!=formatStr.length){ return false; }else{ if(formatStr=="hh:mm:ss"){ var r1=/^(([0-1][0-9])|(2[0-3])):([0-5][0-9]):([0-5][0-9])$/; return r1.test(timeStr); }else if(formatStr=="hh-mm-ss"){ var r2=/^(([0-1][0-9])|(2[0-3]))-([0-5][0-9])-([0-5][0-9])$/; return r2.test(timeStr); }else if(formatStr=="hh/mm/ss"){ var r3=/^(([0-1][0-9])|(2[0-3]))\/([0-5][0-9])\/([0-5][0-9])$/; return r3.test(timeStr); }else{// throw new Error("时间格式不正确!"); return false; } } return false; }, isValiDateTime:function(dateTimeStr){ var dateTimeReg=/^(((((([02468][048])|([13579][26]))(00))|(d{2}(([02468][48])|([13579][26]))))-((((0[13578])|(1[02]))-(([0-2][0-9])|(3[01])))|(((0[469])|(11))-(([0-2][0-9])|(30)))|(02-([0-2][0-9]))))|(d{2}(([02468][1235679])|([13579][01345789]))-((((0[13578])|(1[02]))-(([0-2][0-9])|(3[01])))|(((0[469])|(11))-(([0-2][0-9])|(30)))|(02-(([0-1][0-9])|(2[0-8]))))))(s{1}(([0-1][0-9])|(2[0-3])):([0-5][0-9]):([0-5][0-9]))?$/ return dateTimeReg.test(dateTimeStr); }, isLeapYear:function(){ return (this.getYear()%4==0&&((this.getYear()!=0)||(this.getYear()%400==0))); }, daysBetween:function(dateOne,dateTwo){ if((dateOne instanceof Date)==false||(dateTwo instanceof Date)==false){ return 0; }else{ return Math.abs(Math.floor((dateOne.getTime()-dateTwo.getTime())/1000/60/60/24)); } }, dateDiff:function(dtEnd, field){ var dtStart = this; if((dtEnd instanceof Date)==false){ return 0; }else{ if(!field){ field = "d"; } switch(field){ case ‘Y‘: case ‘y‘:return dtEnd.getFullYear() - dtStart.getFullYear();break; case ‘M‘:return (dtEnd.getMonth()+1)+((dtEnd.getFullYear()-dtStart.getFullYear())*12) - (dtStart.getMonth()+1);break; case ‘W‘: case ‘w‘:return parseInt((dtEnd - dtStart) / (86400000 * 7));break; case ‘D‘: case ‘d‘:return parseInt((dtEnd - dtStart) / 86400000);break; case ‘H‘: case ‘h‘:return parseInt((dtEnd - dtStart) / 3600000);break; case ‘m‘:return parseInt((dtEnd - dtStart) / 60000);break; case ‘S‘: case ‘s‘:return parseInt((dtEnd - dtStart) / 1000);break; default: return 0; } return 0; } }, toArray:function(){ var myArray = new Array(); myArray[0] = this.getFullYear(); myArray[1] = this.getMonth(); myArray[2] = this.getDate(); myArray[3] = this.getHours(); myArray[4] = this.getMinutes(); myArray[5] = this.getSeconds(); return myArray; }, datePart:function(field){ if(!field){ field = "d"; } var Week = [‘日‘,‘一‘,‘二‘,‘三‘,‘四‘,‘五‘,‘六‘]; switch (field){ case ‘Y‘ : case ‘y‘ :return this.getFullYear();break; case ‘M‘ :return (this.getMonth()+1);break; case ‘W‘ : case ‘w‘ :return Week[this.getDay()];break; case ‘D‘ : case ‘d‘ :return this.getDate();break; case ‘H‘ : case ‘h‘ :return this.getHours();break; case ‘m‘ :return this.getMinutes();break; case ‘s‘ :return this.getSeconds();break; default:return this.getDate(); } return this.getDate(); }});/** * 对ajax的扩展 * 调用示例: * new HttpAjax({ type:"get", url:"testAjax.php", data:{"name":‘Jack‘}, success:function(data){ console.log(data); }, failure:function(data){ console.log(data); }, isAsyn:false }); */HttpAjax = (function(){ function HttpAjax(options){ var settings={ type:‘post‘, //请求类型 url:‘‘, //请求地址 data:{"id":-1}, //json格式的参数 success:function(){},//成功的回调函数 failure:function(){},//失败的回调函数 isAsyn:true //是否为异步 }; this.options = Object.extend(settings,options); Object.extend(HttpAjax.prototype,{ _createXhr:function(){ if (typeof XMLHttpRequest !== ‘undefined‘) { return new XMLHttpRequest(); } else if (typeof ActiveXObject !== ‘undefined‘) { var versions = [‘MSXML2.XMLHttp.6.0‘, ‘MSXML2.XMLHttp.3.0‘, ‘MSXML2.XMLHttp‘]; for (var i = 0, len = versions.length; i < len; i++) { try { var xhr = new ActiveXObject(versions[i]); this.IsCreateOk = versions[i]; return xhr; } catch (e) { } } if (typeof this.IsCreateOk === ‘undefined‘) { throw new Error("您的浏览器版本过低,无法创建异步对象,请升级您的浏览器!"); } } }, _encodeData:function(paramters){ var data = http://www.mamicode.com/[];"color: #0000ff">for (var name in paramters) { //将数组中的数据以=拼接后再添加到data数组中 [name=aa,age=11] var _regesp = /%20/g; //空格的正则表达式 var _value = http://www.mamicode.com/paramters[name].toString(); //获取值 data.push(encodeURIComponent(name).replace(_regesp, ‘+‘) + "=" + encodeURIComponent(_value).replace(_regesp, ‘+‘)); } //以&将数组元素拼接后返回 如:name=aa&age=11 return data.join("&"); }, _regCallback:function(xhr){ var _this=this; xhr.onreadystatechange = function(){ if (xhr.readyState == 4) { if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 300) { _this.options.success(_this._getResponseData(xhr), xhr.statusText); } else { _this.options.failure(xhr.status, xhr.statusText); } } } }, _getResponseData:function(xhr){ var responseType = xhr.getResponseHeader("Content-Type"); switch (responseType) { case ‘text/xml‘: return xhr.responseXML; case ‘text/json‘: case ‘text/javascript‘: case ‘application/javascript‘: case ‘application/x-javascript‘: return eval(‘(‘ + xhr.responseText + ‘)‘); default: return xhr.responseText; }; }, _init:function(options){ this.options=options; if(this.options.url=="") return; this.xhr = this._createXhr();//创建异步对象 this._regCallback(this.xhr);//注册回调事件 //根据请求类型,发送异步请求 if(this.options.type.toLowerCase()=="post"){ this._post(this.xhr); } else{ this._get(this.xhr); } }, _post:function(xhr){ this.xhr=xhr; this.data=http://www.mamicode.com/this._encodeData(this.options.data); this.url=this.options.url+"?d=" + parseInt(Math.random()*100+1,10); this.asyn=!!this.options.isAsyn; xhr.open("POST", this.url, this.asyn); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.send(this.data); }, _get:function(xhr){ this.xhr=xhr; this.data=http://www.mamicode.com/this._encodeData(this.options.data); this.url=this.options.url+‘?‘ + this.data + ‘&d=‘ + parseInt(Math.random()*100+1,10); this.asyn=!!this.options.isAsyn; xhr.open(‘GET‘, this.url, this.asyn); xhr.send(null); } }); this._init(this.options); }; return HttpAjax;})(window);/** * 对cookie的扩展 */Object.extend(Document.cookie.prototype,{ setCookie:function(name,value,days){ var d = new Date(); d.setDate(d.getDate()+days); document.cookie=name+‘=‘+value+‘;expires‘+d; }, getCookie:function(name){ var arr = document.cookie.split(‘,‘); for(var i= 0,len=arr.length; i<len; i++){ var keyV = arr[i].split(‘=‘); if(keyV[0]==name){ return keyV[1]; } } return ‘‘; }, removeCookie:function(name){ setCookie(name,‘‘,-1); }});})(window)