/*************************************************
Validator v1.0
cody by 我佛山人
wfsr@cunite.com
http://www.cunite.com
***************************************************
Validator v1.1
cody by Todd Lee
lijiantao@eyou.com
http://www.todd-lee.com
log:
1.增加了用户名(Username),无符号字符串(Nosign)的验证方式。
2.改进错误提示方式3中的提示方法。会先判断是否已存在信息提示框,如果存在,则重写其中内容。
3.增加当输入框失去焦点时进行单项验证功能。
*************************************************
Validator v1.2
cody by www.phppx.com
log:
1.修改了一些验证正则
2.修改了 GetNoticeBox 方法,由 appendChild 改为 insertAfter
3.修改了 ShowOkMsg 和 ShowErrorMsg 方法的 span.id 名称,使之更利于前台的开发
*************************************************/
Validator = {
Require : /.+/, //一定有值
Username : /^[/u4E00-/u9FA5/w]{3,20}$/, //用户名
Password : /^[/w-_/~!@#/$%/^&/*/./(/)/[/]/{/}<>/?'/"]{6,20}$/, //密码
nick : /^[^-/s/~!@#/$%/^&/*/./(/)/[/]/{/}<>/?/'/"]{2,4}$/, //昵称
V_code : /^[a-zA-Z0-9]{4}$/, //验证码
//Email : /^[0-9a-zA-Z]+([-/._][0-9a-zA-Z]+)*@[0-9a-zA-Z]+([-/.][0-9a-zA-Z]+)*/.[a-zA-Z]{2,}$/,
Email : /^[0-9a-zA-Z]+([-/._][0-9a-zA-Z]+)*@([0-9a-zA-Z][0-9a-zA-Z-]*/.)+([a-zA-Z]{2,})+$/,
Domain : /^([0-9a-zA-Z][0-9a-zA-Z-]*/.)+([a-zA-Z]{2,})+$/, //域名
Phone : /^/d{3,4}-/d{7,8}(-/d{1,5})?$/, //固定电话
Mobile : /^1/d{10}$/, //手机号码
Unicom : /^13[0123]/d{8}|153/d{8}$/, //联通
Url : /^http:([0-9a-zA-Z][0-9a-zA-Z-]*/.)+([a-zA-Z]{2,})+/, //url
IdCard : /^/d{15}(/d{2}[X0-9])?$/, //身份证
zipCode : /^/d{6}$/, //邮编
Currency : /^/d+/./d{2}$/, //货币
Number : /^/d+$/, //数字
QQ : /^[1-9]/d{5,11}$/, //QQ
Integer : /^[-/+]?/d+$/, //有正负的数字
Double : /^[-/+]?/d+(/./d+)?$/, //有正负的小数
English : /^[A-Za-z]+$/, //英文
Chinese : /^[/u4E00-/u9FA5]+$/, //中文
Lblank : /^/s+/, //左空格
Rblank : //s+$/, //右空格
UnLblank : /^[^/s]+/,
UnRblank : /[^/s]+$/,
regexp : /^//.+//i?m?g?$/, //正则
date : /^(?:(?!0000)[0-9]{4}([-/.]?)(?:(?:0?[1-9]|1[0-2])([-/.]?)(?:0?[1-9]|1[0-9]|2[0-8])|(?:0?[13-9]|1[0-2])([-/.]?)(?:29|30)|(?:0?[13578]|1[02])([-/.]?)31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)([-/.]?)0?2([-/.]?)29)$/,
dateB : /^(?:(?:1[6-9]|[2-9][0-9])[0-9]{2}([-/.]?)(?:(?:0?[1-9]|1[0-2])/1(?:0?[1-9]|1[0-9]|2[0-8])|(?:0?[13-9]|1[0-2])/1(?:29|30)|(?:0?[13578]|1[02])/1(?:31))|(?:(?:1[6-9]|[2-9][0-9])(?:0[48]|[2468][048]|[13579][26])|(?:16|[2468][048]|[3579][26])00)([-/.]?)0?2/2(?:29))$/,
datetime : /^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)/s+([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/,
time : /^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/,
ipv4 : /^((25[0-5]|2[0-4]/d|[01]?/d/d?)/.){3}(25[0-5]|2[0-4]/d|[01]?/d/d?)$/, //ip地址
UnSafe : /[-_/~!@#/$%/^&/*/./(/)/[/]/{/}<>/?/'/"/s]/, //特殊字符
IsSafe : function(str){return !this.UnSafe.test(str);}, //非特殊字符
SafeString : "this.IsSafe(value)",
Limit : "this.limit(value.length,getAttribute('min'), getAttribute('max'))",
LimitB : "this.limit(this.LenB(value), getAttribute('min'), getAttribute('max'))",
Date : "this.IsDate(value, getAttribute('format'))",
Repeat : "value == document.getElementById(getAttribute('to')).value",
Range : "Number(getAttribute('min')) < value && value < Number(getAttribute('max'))",
Compare : "this.compare(value,getAttribute('operator'),Number(getAttribute('to')))",
Custom : "this.Exec(value, getAttribute('regexp'))",
Group : "this.MustChecked(getAttribute('name'), getAttribute('min'), getAttribute('max'))",
ErrorItem : [document.forms[0]],
OkItem : [document.forms[0]],
ErrorMessage : ["以下原因导致提交失败:/t/t/t/t/n"],
OkMessage : ["以下内容已通过验证:/t/t/t/t/n"],
Validate : function(theForm, mode){
//event.srcElement,引发当前函数的源对象
var obj = theForm || event.srcElement;
var count = obj.elements.length; //元素个数
this.ErrorMessage.length = 1; //错误个数
this.ErrorItem.length = 1; //错误元素个数
this.ErrorItem[0] = obj; //ErrorItem[0]为obj
this.OkMessage.length = 1; //通过个数
this.OkItem.length = 1; //通过元素个数
this.OkItem[0] = obj; //.OkItem[0] 为obj
for(var i=0;i<count;i++){
//果你想使用某个对象的许多属性或方法时,只要在with语句的()中写出这个对象的名称,然后在下面的执行语句中直接写这个对象的属性名或方法名就可以了。
with(obj.elements[i]){ //遍历元素
var _dataType = getAttribute("dataType"); //获取dataType属性
if(typeof(_dataType) == "object") continue; //如果_dataType为null
var typeArr = _dataType.split(",");
for(var j=0;j<typeArr.length;j++) {
_dataType = typeArr[j];
if(typeof(this[_dataType]) == "undefined") continue; //如果没有找到相关属性
this.ClearState(obj.elements[i]); //清理当前元素状态
if(getAttribute("require") == "false" && value == "") continue; //如果不是require,value为空则不做验证
switch(_dataType){
case "Date" :
case "Repeat" :
case "Range" :
case "Compare" :
case "Custom" :
case "Group" :
case "Limit" :
case "LimitB" :
case "SafeString" :
//this是with代表的对象
if(!eval(this[_dataType])) { //如果没有通过验证
this.AddError(i, getAttribute("msg")); //添加错误信息 getAttribute("msg") 是获取msg的属性的值
}
else if(getAttribute("okmsg")) {
this.AddOk(i, getAttribute("okmsg")); //ok信息
}
break;
default :
if(!this[_dataType].test(value)) { //其余的用正则做验证
this.AddError(i, getAttribute("msg"));
}
else if(getAttribute("okmsg")) {
this.AddOk(i, getAttribute("okmsg"));
}
break;
}
}
}
}
this.ShowOkMsg(mode);
return(this.ShowErrorMsg(mode));
},
ValidateOne : function(theElement, mode){
var obj = theElement || event.srcElement; //事件的源对象
this.ErrorMessage.length = 1; //错误信息的长度是1
this.ErrorItem.length = 1; //错误元素的长度是1
this.ErrorItem[0] = obj; //错误元素的第一个单元是事件的源对象
this.OkMessage.length = 1; //通过的信息长度是1
this.OkItem.length = 1; //通过的元素长度是1
this.OkItem[0] = obj; //通过元素的第一个单元是事件的源对象
with(obj){ //with代码里的属性或者方法,都是obj的
var _dataType = getAttribute("dataType"); //获取dataType的属性值
if(typeof(_dataType) == "object") { //如果_dataType为null
var a;
} else {
var typeArr = _dataType.split(","); //用,拆分_dataType
for(var j=0;j<typeArr.length;j++) { //开始循环
_dataType = typeArr[j]; //获取单个的dataType的值
if(typeof(this[_dataType]) == "undefined") { //如果没有要验证的dataType
var a;
} else {
this.ClearState(obj); //清理状态
if(getAttribute("require") == "false" && value == ""){ //如果require这个属性为false,并且value为空,就不做验证
var b; //do nothing;
} else {
switch(_dataType){
case "Date" :
case "Repeat" :
case "Range" :
case "Compare" :
case "Custom" :
case "Group" :
case "Limit" :
case "LimitB" :
case "SafeString" :
if(!eval(this[_dataType])) { //如果验证失败
this.AddErrorOne(obj, getAttribute("msg")); //添加错误信息
}
else if(getAttribute("okmsg")) { //如果验证成功
this.AddOkOne(obj, getAttribute("okmsg")); //添加ok信息
}
break;
default : //做正则验证
if(!this[_dataType].test(value)){ //如果验证失败
this.AddErrorOne(obj, getAttribute("msg"));
}
else if(getAttribute("okmsg")) { //如果验证成功
this.AddOkOne(obj, getAttribute("okmsg"));
}
break;
}
}
}
}
}
}
this.ShowOkMsg(mode);
return( this.ShowErrorMsg(mode) );
},
//创建span
GetNoticeBox : function(obj) {
try{
if(obj.parentNode.childNodes[obj.parentNode.childNodes.length-1]){ //如果存在同级的最后一个元素
var lastNode = obj.parentNode.childNodes[obj.parentNode.childNodes.length-1];
}
if( lastNode && lastNode.tagName == "SPAN"){ //如果tag是span
var span = lastNode;
}
else if( obj.nextSibling && obj.nextSibling.tagName == "SPAN" ){ //如果存在同级的下一个元素
var span = obj.nextSibling;
}
else{ //创建一个span元素
var span = document.createElement("SPAN");
//obj.parentNode.appendChild(span);
this.insertAfter(span,obj);
}
return span;
}
catch(e) {
return null;
}
},
//打印错误信息
ShowErrorMsg : function(mode){
if(this.ErrorMessage.length > 1){
mode = mode || 1;
var errCount = this.ErrorItem.length;
switch(mode){
case 2 : //让input文字变红
for(var i=1;i<errCount;i++)
this.ErrorItem[i].style.color = "red";
//this.ErrorItem[i].className = "text-error";
case 1 : //alert所有错误信息
alert(this.ErrorMessage.join("/n"));
this.ErrorItem[1].focus();
break;
case 3 : //创建span,文字变红
for(var i=1;i<errCount;i++){
try{
var span = this.GetNoticeBox(this.ErrorItem[i]);
span.innerHTML = this.ErrorMessage[i].replace(//d+:/,"");
span.className = "noticeError";
span.id = "__ErrorMessagePanel"+"_"+this.ErrorItem[i].id;
span.style.color = "red";
//this.ErrorItem[1].focus();
}
catch(e){alert(e.description);}
}
break;
default :
alert(this.ErrorMessage.join("/n"));
break;
}
return false;
}
return true;
},
//打印OK信息
ShowOkMsg : function(mode){
if(this.OkMessage.length > 1){
mode = mode || 3;
var okCount = this.OkItem.length; //通过验证元素的个数
switch(mode){
case 2 : //颜色变绿色
for(var i=1;i<okCount;i++)
this.OkItem[i].style.color = "green";
case 1 : //什么也不做
//alert(this.OkMessage.join("/n"));
//this.OkItem[1].focus();
break;
case 3 : //创建span
for(var i=1;i<okCount;i++){
try{
var span = this.GetNoticeBox(this.OkItem[i]); //创建span
span.innerHTML = this.OkMessage[i].replace(//d+:/,""); //去掉数字和:
//span.className = "noticeInfo";
span.id = "__ErrorMessagePanel"+"_"+this.OkItem[i].id;
span.style.color = "green";
}
catch(e){alert(e.description);}
}
break;
default :
//alert(this.OkMessage.join("/n"));
break;
}
return true;
}
return true;
},
//清理状态
ClearState : function(elem){
with(elem){
if(style.color == "red") //如果颜色是红色
style.color = "";
className = "text";
var lastNode = parentNode.childNodes[parentNode.childNodes.length-1]; //同级最后一个对象
if (lastNode && lastNode.id) {
if(lastNode.id.substr(0,19) == "__ErrorMessagePanel"){ //如果id是 __ErrorMessagePanel
//parentNode.removeChild(lastNode);
lastNode.style.color = "";
lastNode.className = "noticeInfo";
lastNode.innerHTML = "";
}
} else if (nextSibling && nextSibling.id) {
if(nextSibling.id.substr(0,19) == "__ErrorMessagePanel" ){ //下一个元素是 __ErrorMessagePanel
nextSibling.style.color = "";
nextSibling.className = "noticeInfo";
nextSibling.innerHTML = "";
}
}
}
},
//添加错误信息
AddError : function(index, str){
//elements是js中的关键字,代表document中所有元素的集合
this.ErrorItem[this.ErrorItem.length] = this.ErrorItem[0].elements[index]; //错误元素
this.ErrorMessage[this.ErrorMessage.length] = this.ErrorMessage.length + ":" + str; //错误信息
},
//添加一个错信息
AddErrorOne : function(obj, str){
this.ErrorItem[this.ErrorItem.length] = obj; //
this.ErrorMessage[this.ErrorMessage.length] = this.ErrorMessage.length + ":" + str;
},
//添加OK信息
AddOk : function(index, str){
this.OkItem[this.OkItem.length] = this.OkItem[0].elements[index];
this.OkMessage[this.OkMessage.length] = this.OkMessage.length + ":" + str;
//alert(this.OkMessage);
},
//添加一个OK信息
AddOkOne : function(obj, str){
this.OkItem[this.OkItem.length] = obj;
this.OkMessage[this.OkMessage.length] = this.OkMessage.length + ":" + str;
},
//正则验证
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);
}
},
//判断单选,复选的选择情况
MustChecked : function(name, min, max){
var groups = document.getElementsByName(name);
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;
},
//判断长度
limit : function(len,min, max){
min = min || 0;
max = max || Number.MAX_VALUE;
return min <= len && len <= max;
},
//双字节算2个字符
LenB : function(str){
return str.replace(/[^/x00-/xff]/g,"**").length;
},
insertAfter: function(newElement, targetElement) {
var parent = targetElement.parentNode;
if(parent.lastChild == targetElement) {
parent.appendChild(newElement);
} else {
parent.insertBefore(newElement, targetElement.nextSibling);
}
},
//日期验证
IsDate : function(op, formatString){
formatString = formatString || "ymd";
var m, year, month, day;
switch(formatString){
case "ymd" :
m = op.match(new RegExp("^//s*((//d{4})|(//d{2}))([-./])(//d{1,2})//4(//d{1,2})//s*$"));
if(m == null ) return false;
day = m[6];
month = m[5]--;
year = (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3], 10));
break;
case "dmy" :
m = op.match(new RegExp("^//s*(//d{1,2})([-./])(//d{1,2})//2((//d{4})|(//d{2}))//s*$"));
if(m == null ) return false;
day = m[1];
month = m[3]--;
year = (m[5].length == 4) ? m[5] : GetFullYear(parseInt(m[6], 10));
break;
default :
break;
}
var date = new Date(year, month, day);
return (typeof(date) == "object" && year == date.getFullYear() && month == date.getMonth() && day == date.getDate());
function GetFullYear(y){return ((y<30 ? "20" : "19") + y)|0;}
}
}