/*********************************************
验证组件说明 --版本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