/********************************************* 验证组件说明 --版本0.9.12.1123.alpha 将验证组件包含于网页内,例: 加载完成后,组件将自动寻找网页内的验证控件。 初始选框说明:表单控件中加入initvalue属性,并在属性中加入初始值,多选框的值可由","符号分割开,checkbox和radio类型的可放置此属性于任意一个控件中。 可以在页面加载完时自动选择需要的选项。 验证控件说明:任何input类型的控件,只需在控件中增加验证属性即可由本组件进行即时输入验证。 属性说明: datatype --主要验证属性,说明验证类型及其是否必填。例:datatype="email,1" email表示验证email形式的内容,1表示必填,之间用‘,’分隔,后一项如没有即默认为必填。 err --错误后显示提示文字。 msg --输入时提示文字。 提示信息格式和样式: .inputmsg{ line-height:25px; background-color:#ccffcc;padding:2px 10px 2px 10px; border:solid 1px #66cc66;} .inputerr{ line-height:25px; background-color:#ffcccc;padding:2px 10px 2px 10px; border:solid 1px #cc6666;} .inputok{ width:21px; height:21px; background-image:url(right.gif);} inputmsg为提示样式,inputerr为错误样式,inputok为正确样式。 样式放置于样式表或页面样式中,根据需要进行修改。 验证类型: empty --验证空值 email --验证email地址 domain --验证域名 phone --验证电话号码 mobile --验证手机号码 url --验证网址 idcard --验证身份证号码 currency --验证货币 number --验证正整数 zip --验证邮编 qq --验证qq号码 integer --验证整数 double --验证浮点数 english --验证英文字符(大小写) chinese --验证中文字符 filename --验证文件名 username --验证首字母为小写英文,4个字符以上的用户名类型 datetime --验证日期+时间格式 safestring --验证安全密码字符串 limit{min,max} --限制字符串长度,min最小,max最大 limitb{min,max} --限制字符串字节大小,min最小,max最大 date{min,format} --验证日期格式,min最小日期,format日期格式 repeat{to} --验证重复输入值,to重复控件 range{min,max} --验证中间值,min最小,max最大 compare{operator,to} --对比验证控件值,operator{notequal:!=,greaterthan:>,greaterthanequal:>=,lessthan:<,lessthanequal:<=},to对比控件 datecompare{operator,to} --对比验证控件日期值,operator{notequal:!=,greaterthan:>,greaterthanequal:>=,lessthan:<,lessthanequal:<=},to对比日期控件 custom{regexp} --自定义验证公式,regexp验证正则 checkuser --验证用户名是否可用,url为验证地址。 group --组控件验证 */ validator = { empty : /.+/, email : /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/, domain : /^\w+([-.]\w+)*\.\w+([-.]\w+)*$/, phone : /^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$/, phones : /^(((\(\d{2,3}\))|(\d{3}\-))?13\d{9}$)|(((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$)/, mobile : /^((\(\d{2,3}\))|(\d{3}\-))?13\d{9}$/, url : /^http:\/\/[a-za-z0-9]+\.[a-za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/, idcard : "this.isidcard(value)", currency : /^\d+(\.\d+)?$/, number : /^\d+$/, zip : /^[1-9]\d{5}$/, qq : /^[1-9]\d{4,9}$/, integer : /^[-\+]?\d+$/, double : /^[-\+]?\d+(\.\d+)?$/, english : /^[a-za-z]+$/, chinese : /^[\u0391-\uffe5]+$/, filename: /^[\w\d]+$/, username : /^[a-za-z]\w{3,}$/i, unsafe : /^(([a-z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\"]*)|.{0,5})$|\s/, datetime :/^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-)) (20|21|22|23|[0-1]?\d):[0-5]?\d:[0-5]?\d$/, checkuser: "this.docheckuser(value,getattribute('url'))", issafe : function(str){return !this.unsafe.test(str);}, safestring : "this.issafe(value)", filter : "this.dofilter(value, getattribute('accept'))", limit : "this.limit(value.length,getattribute('min'), getattribute('max'))", limitb : "this.limit(this.lenb(value), getattribute('min'), getattribute('max'))", date : "this.isdate(value, getattribute('min'), getattribute('format'))", repeat : "value == document.getelementsbyname(getattribute('to'))[0].value", range : "getattribute('min') < (value|0) && (value|0) < getattribute('max')", compare : "this.compare(value,getattribute('operator'),getattribute('to'))", datecompare : "this.datecompare(value,getattribute('operator'),document.getelementsbyname(getattribute('to'))[0].value)", custom : "this.exec(value, getattribute('regexp'))", group : "this.mustchecked(getattribute('name'))", erroritem : [document.forms[0]], errormessage : [""], validate:function(obj,mode) { var _datatype,_nonull,_errmsg; if(obj.getattribute("type")=="checkbox"){ _datatype=document.getelementsbyname(obj.getattribute("name"))[0].getattribute("datatype"); _errmsg=document.getelementsbyname(obj.getattribute("name"))[0].getattribute("err"); } else { _datatype=obj.getattribute("datatype"); _errmsg=obj.getattribute("err"); } if(_datatype==null) return; _nonull=true; if(_datatype.indexof(",")>=0){ _nonull=(_datatype.substring(_datatype.indexof(",")+1)!="0"); _datatype=_datatype.substring(0,_datatype.indexof(",")); } var _isvalid=true; this.clearstate(obj); with(obj) { if(value=="" || !value){ if(_nonull){ this.errormessage="此为必填项"; _isvalid=false; } } else { switch (_datatype) { case "idcard" : case "date" : case "repeat" : case "range" : case "datecompare" : case "compare" : case "custom" : case "group" : case "limit" : case "limitb" : case "safestring" : case "filter" : case "checkuser" : if(!eval(this[_datatype])) { this.adderror(_errmsg); _isvalid=false; } break; default: if(!this[_datatype].test(value)) { this.adderror(_errmsg); _isvalid=false; } break; } } } try { var div = document.createelement("label"); div.classname=(_isvalid)?"inputok":"inputerr"; if((obj.parentnode.offsetwidth-obj.offsetwidth)>25 || !_isvalid) obj.parentnode.insertbefore(div,obj.nextsibling); if(!_isvalid) div.innerhtml=this.errormessage; } catch(e) { alert(e.description); } return _isvalid; }, exec : function(op, reg){ return new regexp(reg,"g").test(op); }, compare : function(op1,operator,op2){ switch (operator) { case "notequal": return (op1 != op2); case "greaterthan": return (op1 > op2); case "greaterthanequal": return (op1 >= op2); case "lessthan": return (op1 < op2); case "lessthanequal": return (op1 <= op2); default: return (op1 == op2); } }, datecompare : function(op1,operator,op2){ var dt1=op1.replace(/-/g, "/"); var dt2=op2.replace(/-/g, "/"); dt1 = new date(dt1); dt2 = new date(dt2); var time=dt1.gettime() - dt2.gettime(); switch (operator) { case "notequal": return (time != 0); case "greaterthan": return (time > 0); case "greaterthanequal": return (time >= 0); case "lessthan": return (time < 0); case "lessthanequal": return (time <= 0); default: return (time == 0); } }, mustchecked : function(name) { var groups = document.getelementsbyname(name); var min, max; min=groups[0].min; max=groups[0].max; var haschecked = 0; min = min || 1; max = max || groups.length; for(var i=groups.length-1;i>=0;i--) if(groups[i].checked) haschecked++; return min <= haschecked && haschecked <= max; }, dofilter : function(input, filter) { return new regexp("^.+\.(?=ext)(ext)$".replace(/ext/g, filter.split(/\s*,\s*/).join("|")), "gi").test(input); }, showstate : function(obj) { this.clearstate(obj); with(obj){ if(typeof(msg)!="undefined") { var div = document.createelement("label"); div.classname="inputmsg"; parentnode.insertbefore(div,obj.nextsibling); div.innerhtml=msg; } } }, clearstate : function(obj) { with(obj){ if(style.color == "red") style.color = ""; var lastnode = nextsibling; try{ if(lastnode.classname.substring(0,5) == "input") parentnode.removechild(lastnode); } catch(e){} } }, adderror : function(str) { if(str!=""&&str!=null) { this.errormessage = str; } else { this.errormessage =""; } }, isidcard : function(number) { var date, ai; var verify = "10x98765432"; var wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; var area = ['','','','','','','','','','','','北京','天津','河北','山西','内蒙古','','','','','','辽宁','吉林','黑龙江','','','','','','','','上海','江苏','浙江','安微','福建','江西','山东','','','','河南','湖北','湖南','广东','广西','海南','','','','重庆','四川','贵州','云南','西藏','','','','','','','陕西','甘肃','青海','宁夏','新疆','','','','','','台湾','','','','','','','','','','香港','澳门','','','','','','','','','国外']; var re = number.match(/^(\d{2})\d{4}(((\d{2})(\d{2})(\d{2})(\d{3}))|((\d{4})(\d{2})(\d{2})(\d{3}[x\d])))$/i); if(re == null) return false; if(re[1] >= area.length || area[re[1]] == "") return false; if(re[2].length == 12){ ai = number.substr(0, 17); date = [re[9], re[10], re[11]].join("-"); } else{ ai = number.substr(0, 6) + "19" + number.substr(6); date = ["19" + re[4], re[5], re[6]].join("-"); } if(!this.isdate(date, "ymd")) return false; var sum = 0; for(var i = 0;i<=16;i++){ sum += ai.charat(i) * wi[i]; } ai += verify.charat(sum%11); return (number.length ==15 || number.length == 18 && number == ai); }, limit : function(length,min,max) { if(!min) return length=min; return (length>=min && length -1 ) options[i].selected=true; } } else if(nodename=="input"){ if(initvalue=="") return; switch(type){ case "radio": var radio=form.elements[name]; for(var i=0;i -1 ); } break; default: value=initvalue; break; } } } } }, isdate : function(op, formatstring){ formatstring = formatstring || "ymd"; var m, year, month, day; switch(formatstring){ case "ymd" : m = op.match(new regexp("^((\\d{4})|(\\d{2}))([-./])(\\d{1,2})\\4(\\d{1,2})$")); if(m == null ) return false; day = m[6]; month = m[5]*1; year = (m[2].length == 4) ? m[2] : getfullyear(parseint(m[3], 10)); break; case "dmy" : m = op.match(new regexp("^(\\d{1,2})([-./])(\\d{1,2})\\2((\\d{4})|(\\d{2}))$")); if(m == null ) return false; day = m[1]; month = m[3]*1; year = (m[5].length == 4) ? m[5] : getfullyear(parseint(m[6], 10)); break; default : break; } if(!parseint(month)) return false; month = month==0 ?12:month; var date = new date(year, month-1, day); return (typeof(date) == "object" && year == date.getfullyear() && month == (date.getmonth()+1) && day == date.getdate()); function getfullyear(y){return ((y<30 ? "20" : "19") + y)|0;} }, docheckuser : function(str,url){ var httprequest = new this.httpobject(); // xmlhttprequest()对象实例化 httprequest.open("get",url + encodeuri(str),false); httprequest.send(); var content=httprequest.responsetext; httprequest=null; return (content=="true"); }, httpobject : function() { try { return new activexobject("msxml2.xmlhttp.6.0"); } catch(e){ try { return new activexobject("msxml2.xmlhttp.3.0"); } catch(e){ try { return new activexobject("msxml2.xmlhttp"); } catch(e){ try { return new activexobject("microsoft.xmlhttp"); } catch(e){ try { return new xmlhttprequest() } catch(e){ throw new error( "this browser does not support xmlhttprequest." ); }}}}}} } var o=window.onload; if(typeof(o)=="function") o(); window.onload = function(){ if(document.forms.length==0) return; for(var j=0;j