/**
* 使用本js必须包含prototype.js(>=1.5), util.js和dateUtils.js
*/
Validator = {
// Require应该允许空白字符,如果不允许空白,请使用NoBlank -whj 2007-5-12
Require : /^/S+/,
NoBlank: /^/S+$/,
Email : /^/w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*$/,
Emails : /^((/w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*)([,;]{0,1}))*$/,
Phone : /^((/(/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}/-))?((1/d{10}))$/,
Url : /^http:[A-Za-z0-9]+/.[A-Za-z0-9]+[//=/?%/-&_~`@[/]/':+!]*([^<>/"/"])*$/,
IdCard : "this.IsIdCard(value)",
IdCard1 : "this.IsIdCard1(value)",
Currency : /^/d+(/./d+)?$/,
Number : /^/d+$/,
Number1 : /^/d+X?$/,
Zip : /^[0-9]/d{5}$/,
Zip1 : /^62+[0-9]/d{3}$/,
BankCard : /^62+[0-9]/d{10,17}$/,
QQ : /^[1-9]/d{4,8}$/,
Integer : /^[-/+]?/d+$/,
PInt : /^[+]?/d+$/,
NInt : /^-?/d+$/,
Double : /^[-/+]?/d+(/./d+)?$/,
English : /^[A-Za-z]+$/,
Chinese : /^[/u0391-/uFFE5]+$/,
Username : /^[a-z, 0-9]{4,20}|/w{4,20}$/i,
CheckPswd : function(passwordStr){ //验证密码,此函数由郑亮添加,2009/11/12
var isRight = true;
var passRule = /^(([0-9]+[a-zA-Z]+[0-9]*)|([a-zA-Z]+[0-9]+[a-zA-Z]*))+$/;//此正则表达匹配至少一个数字和一个字母且长度为6-25位。
if(!passRule.test(passwordStr) || passwordStr.length < 6 || passwordStr.length >20) {
isRight = false;
}
else { //验证至少有三个字符不同
var pswdArray = [];
var n=0;
while(n<passwordStr.length){
pswdArray.push(passwordStr.substring(n,n+1));
n++;
}
var tempArray = [];
tempArray.push(pswdArray[0]);
for(var i=0;i<pswdArray.length;i++){
var isexist = false;
for(var j=0;j<tempArray.length;j++){
if(tempArray[j] == pswdArray[i]){
isexist = true;
}
else if(j == tempArray.length-1 && !isexist){
tempArray.push(pswdArray[i]);
}
}
if(tempArray.length > 3) break;
}
if(tempArray.length < 3){
isRight = false;
}
}
return isRight;
},
Password : "this.CheckPswd(value)",
UnSafe : /^(([A-Z]*|[a-z]*|/d*|[-_/~!@#/$%/^&/*/./(/)/[/]/{/}<>/?/'/"]*)|.{0,5})$|/s/,
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('format'), getAttribute('min'), getAttribute('max'))",
DayHM : "this.IsDayHM(value, getAttribute('format'), getAttribute('min'), getAttribute('max'))",
TimeHM : /^[0-9, 10-24]{1,2}:[0-30, 30-59]{1,2}$/,
DayHMS : "this.IsDayHMS(value, getAttribute('format'), getAttribute('min'), getAttribute('max'))",
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'))",
// regexp是一个正则表达式,注意:由于是全局匹配,所以可能需要^和$ by whj at 2007-5-18
Custom : "this.Exec(value, getAttribute('regexp'))",
// regexp是一个js函数,其返回一个正则表达式 by whj at 2007-5-18
DynCustom : "this.TestDynaAttr(value, getAttribute('regexp'))",
// intLen: 整数部分位数,=0或不定义,不限制整数位数;
// decimalLen: 小数最大位数,=0或不定义,不限制小数位数。by whj at 2007-5-18
Precision : "this.checkPrecision(value, getAttribute('intLen'), getAttribute('decimalLen'), getAttribute('notNegative'))",
Group : "this.MustChecked(getAttribute('name'), getAttribute('min'), getAttribute('max'))",
ErrorItem : [document.forms[0]],
ErrorMessage : ["There are something wrong as follows: /t/t/t/t"],
// 精简模式
// Limit精简模式,L<max>[_<min>],如dataType="L10_2",表示最多10位,最小2位,一个中文算一位
Ln : /^L(/d+)(_(/d+))?$/,
// LimitB精简模式,LB<max>[_<min>],如dataType="LB10_2",表示最多10位,最小2位,一个中文算两位
LBn : /^LB(/d+)(_(/d+))?$/,
// Range精简模式,R<min>[_<max>],如dataType="R-1_60", 表示数据必须>-1且小于60
Rn : /^R([-+]?/d+(/./d+)?)(_([-+]?/d+(/./d+)?))?$/,
// Range精简模式,Ri<min>[_<max>],如dataType="Ri0_59", 表示数据必须>=0且小于等于59
Rin : /^Ri([-+]?/d+(/./d+)?)(_([-+]?/d+(/./d+)?))?$/,
// 整数Range精简模式,IR<min>[_<max>],如dataType="IR0_59", 表示数据必须>0且小于59,且必须是整数
IRn : /^IR([-+]?/d+)(_([-+]?/d+))?$/,
// 整数Range精简模式,IRi<min>[_<max>],如dataType="IRi0_59", 表示数据必须>=0且小于等于59,且必须是整数
IRin : /^IRi([-+]?/d+)(_([-+]?/d+))?$/,
// precision精简模式, N<intLen>[_<decimalLen>],如dataType="N0_2",表示最多2位小数
Nn : /^N(/d+)(_(/d+))?$/,
// precision精简模式, PN<intLen>[_<decimalLen>],如dataType="PN0_2",表示最多2位小数,且必须为正数
PNn : /^PN(/d+)(_(/d+))?$/,
// precision精简模式, NN<intLen>[_<decimalLen>],如dataType="NN0_2",表示最多2位小数,且必须为非负数
NNn : /^NN(/d+)(_(/d+))?$/,
// precision精简模式, FN<intLen>[_<decimalLen>],如dataType="FN0_2",表示必须2位小数
FNn : /^FN(/d+)(_(/d+))?$/,
// precision精简模式, PFN<intLen>[_<decimalLen>],如dataType="PFN0_2",表示必须2位小数,且必须为正数
PFNn : /^PFN(/d+)(_(/d+))?$/,
Validate : function(theForm, mode, defRequire){
if(typeof defRequire == "undefined") defRequire = true;
//var obj = theForm || event.srcElement; //考虑浏览器兼容,要求theForm参数必须指定,by whj 2007-6-12
var obj = $(theForm);
if(!isElement(obj, "form")) return false;
var count = obj.elements.length;
this.ErrorMessage.length = 1;
this.ErrorItem.length = 1;
this.ErrorItem[0] = obj;
for(var i=0;i<count;i++){
var fulanDataType = obj.elements[i].getAttribute("dataType");
//alert(fulanDataType);
if(fulanDataType == undefined){
continue;
}
//alert(obj.elements[i].getAttribute("name"));//本句调试使用
var dataTypeArray = fulanDataType.split(",");
//由于需要同时验证两个条件,例如格式和长度的验证,所以改成可以支持多个dataType验证。
//dataType="a,b,c"格式 by szy, 2007-9-29
//alert(dataTypeArray.length);
for(var j=0; j<dataTypeArray.length; j++){
var _dataType = dataTypeArray[j];
if(!this.validateElement(obj.elements[i], defRequire, _dataType)){
this.AddError(i, obj.elements[i].getAttribute("msg"));
}
}
}
if(this.ErrorMessage.length > 1){
mode = mode || 1;
var errCount = this.ErrorItem.length;
switch(mode){
case 2 :
for(var i=1;i<errCount;i++)
this.ErrorItem[i].style.color = "red";
case 1 :
alert(this.ErrorMessage.join("/n"));
focusIt(this.ErrorItem[1]);
break;
case 3 :
for(var i=1;i<errCount;i++){
try{
var span = document.createElement("SPAN");
span.id = "__ErrorMessagePanel";
span.style.color = "red";
this.ErrorItem[i].parentNode.appendChild(span);
span.innerHTML = this.ErrorMessage[i].replace(//d+:/,"");
}
catch(e){alert(e.description);}
}
focusIt(this.ErrorItem[1]);
break;
default :
alert(this.ErrorMessage.join("/n"));
break;
}
return false;
}
return true;
},
//2009-3-9鲁黎添加,用于前台银联注册
ValidateRegForm : function(theForm, mode, defRequire){
if(typeof defRequire == "undefined") defRequire = true;
//var obj = theForm || event.srcElement; //考虑浏览器兼容,要求theForm参数必须指定,by whj 2007-6-12
var obj = $(theForm);
if(!isElement(obj, "form")) return false;
var count = obj.elements.length;
this.ErrorMessage.length = 1;
this.ErrorItem.length = 1;
this.ErrorItem[0] = obj;
for(var i=0;i<count;i++){
var fulanDataType = obj.elements[i].getAttribute("dataType");
//alert(fulanDataType);
if(fulanDataType == undefined){
continue;
}
//alert(obj.elements[i].getAttribute("name"));//本句调试使用
var dataTypeArray = fulanDataType.split(",");
//由于需要同时验证两个条件,例如格式和长度的验证,所以改成可以支持多个dataType验证。
//dataType="a,b,c"格式 by szy, 2007-9-29
//alert(dataTypeArray.length);
if ( document.getElementById("register_label") != undefined){
document.getElementById("register_label").innerHTML = "";
}
if (obj.elements[i].getAttribute("name").indexOf("span_") != -1){
document.getElementById("span_"+ obj.elements[i].getAttribute("name")).style.display = '';
}
for(var j=0; j<dataTypeArray.length; j++){
var _dataType = dataTypeArray[j];
if(!this.validateElement(obj.elements[i], defRequire, _dataType)){
//2009-3-6鲁黎添加,用于前台验证。不显示span的灰字提示信息。
document.getElementById("span_"+ obj.elements[i].getAttribute("name")).style.display = 'none';
this.AddError(i, obj.elements[i].getAttribute("msg"));
}
}
}
//alert(this.ErrorMessage.length);
if(this.ErrorMessage.length > 1){
mode = mode || 1;
var errCount = this.ErrorItem.length;
//alert(mode);
switch(mode){
case 2 :
for(var i=1;i<errCount;i++)
this.ErrorItem[i].style.color = "red";
case 1 :
alert(this.ErrorMessage.join("/n"));
focusIt(this.ErrorItem[1]);
break;
case 3 :
for(var i=1;i<errCount;i++){
try{
var span = document.createElement("SPAN");
span.id = "__ErrorMessagePanel";
span.style.color = "red";
this.ErrorItem[i].parentNode.appendChild(span);
span.innerHTML = this.ErrorMessage[i].replace(//d+:/,"");
}
catch(e){alert(e.description);}
}
focusIt(this.ErrorItem[1]);
break;
default :
alert(this.ErrorMessage.join("/n"));
break;
}
return false;
}
return true;
},
/**
* 验证指定元素的输入是否有效
*
* @param e 可以是元素id或元素本身
* @param defRequire =true,则如果没有定义require属性为"false",则为必填;
* 否则如果没有定义reqire属性为"true",则为可选
* @return 如果元素不存在,或者没有指定dataType,或者输入有效,返回true;
* 否则返回false。
*/
validateElement : function (e, defRequire, _dataType) {
defReuire = checkTrue(defRequire, true);
e = $(e);
if(e == null) return true;
if(e.disabled) return true;
if(e.tagName == "INPUT"){
// 只有属性中添加TrimInner的,才将内部的空格也去掉,否则只去掉前后的空格 by whj, 2007-5-10
if(e.getAttribute("trim_inner") == "true")
e.value = e.value.replace(//s+/g, "");
else e.value = e.value.replace(/^/s+|/s+$/mg, "");
}
with(e){
if(_dataType == null) return true;
this.ClearState(e);
var bRequire = checkTrue(getAttribute("require"), defReuire);
if(bRequire) {
if(value.length == 0) return false;
} else if(value.length == 0) return true;
var parts = this.Ln.exec(_dataType);
if(parts != null) return this.limit(value.length, parts[3], parts[1]);
parts = this.LBn.exec(_dataType);
if(parts != null) return this.limit(this.LenB(value), parts[3], parts[1]);
parts = this.Rn.exec(_dataType);
if(parts != null) return this.Double.test(value) && (toFloat(parts[1]) < toFloat(value) && toFloat(value) < toFloat(parts[4]));
parts = this.Rin.exec(_dataType);
if(parts != null) return this.Double.test(value) && (toFloat(parts[1]) <= toFloat(value) && toFloat(value) <= toFloat(parts[4]));
parts = this.IRn.exec(_dataType);
if(parts != null) return this.Integer.test(value) && (toInt(parts[1]) < (value|0) && (value|0) < toInt(parts[3]));
parts = this.IRin.exec(_dataType);
if(parts != null) return this.Integer.test(value) && (toInt(parts[1]) <= (value|0) && (value|0) <= toInt(parts[3]));
parts = this.Nn.exec(_dataType);
if(parts != null) return this.checkPrecision(value, toInt(parts[1]), toInt(parts[3]), false);
parts = this.PNn.exec(_dataType);
if(parts != null) return this.checkPrecision(value, toInt(parts[1]), toInt(parts[3]), true);
parts = this.NNn.exec(_dataType);
if(parts != null) return this.checkPrecision(value, toInt(parts[1]), toInt(parts[3])) && parseFloat(value) >= 0;
parts = this.FNn.exec(_dataType);
if(parts != null) return this.checkFxiedPrecision(value, toInt(parts[1]), toInt(parts[3]), false);
parts = this.PFNn.exec(_dataType);
if(parts != null) return this.checkFxiedPrecision(value, toInt(parts[1]), toInt(parts[3]), true);
if(typeof(this[_dataType]) == "undefined") return true;
switch(_dataType){
case "IdCard" :
case "Date" :
case "DayHM" :
case "DayHMS" :
case "Repeat" :
case "Range" :
case "Compare" :
case "Custom" :
case "DynCustom" :
case "Precision" :
case "Group" :
case "Limit" :
case "LimitB" :
case "SafeString" :
case "Filter" :
case "Password":
return eval(this[_dataType]);
default :
//value = value.replace(//s+/g, "");
// 只有input,才trim空格, by whj, 2007-5-10
return this[_dataType].test(value);
}
}
},
limit : function(len,min, max){
min = min || 0;
max = max || Number.MAX_VALUE;
//alert("min:"+min+", max="+max+", len"+len);
//alert((min <= len) + " && "+ (len <= max)+" = " + (min <= len && len <= max));
return min < len && len <= max;
},
LenB : function(str){
return str.replace(/[^/x00-/xff]/g,"**").length;
},
ClearState : function(elem){
with(elem){
if(style.color == "red")
style.color = "";
var lastNode = parentNode.childNodes[parentNode.childNodes.length-1];
if(lastNode.id == "__ErrorMessagePanel")
parentNode.removeChild(lastNode);
}
},
AddError : function(index, str){
this.ErrorItem[this.ErrorItem.length] = this.ErrorItem[0].elements[index];
this.ErrorMessage[this.ErrorMessage.length] = this.ErrorMessage.length + ":" + str;
},
Exec : function(op, reg){
return new RegExp(reg,"g").test(op);
},
TestDynaAttr : function(op, attr){
return new RegExp(eval(attr),"g").test(op);
},
checkPrecision : function(op, intLen, decimalLen, notNegative) {
intLen = parseInt(intLen);
if(isNaN(intLen)) intLen = 0;
decimalLen = parseInt(decimalLen);
if(isNaN(decimalLen)) decimalLen = 0;
notNegative = checkTrue(notNegative, false);
var reg = "^";
if(!notNegative) reg += "[+//-]?";
if(intLen > 0) {
reg += "//d{1,"+intLen+"}";
} else reg += "//d+";
if(decimalLen > 0) {
reg += "(//.//d{0,"+decimalLen+"})?";
} else reg += "(//.//d+)?";
reg += "$";
return new RegExp(reg, "g").test(op);
},
checkFxiedPrecision : function(op, intLen, decimalLen, notNegative) {
intLen = parseInt(intLen);
if(isNaN(intLen)) intLen = 0;
decimalLen = parseInt(decimalLen);
if(isNaN(decimalLen)) decimalLen = 0;
notNegative = checkTrue(notNegative, false);
var reg = "^";
if(!notNegative) reg += "[+//-]?";
if(intLen > 0) {
reg += "//d{"+intLen+"}";
} else reg += "//d+";
if(decimalLen > 0) {
reg += "(//.//d{"+decimalLen+"})?";
} else reg += "(//.//d+)?";
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;
},
DoFilter : function(input, filter){
return new RegExp("^.+/.(?=EXT)(EXT)$".replace(/EXT/g, filter.split(//s*,/s*/).join("|")), "gi").test(input);
},
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);
},
IsIdCard1 : function(number)
{
var factorArr = new Array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1);
var error;
var varArray = new Array();
var intValue;
var lngProduct = 0;
var intCheckDigit;
var intStrLen = number.length;
var idNumber = number;
if ((intStrLen != 15) && (intStrLen != 18)) {
return false;
}
// check and set value
for(i=0;i<intStrLen;i++) {
varArray[i] = idNumber.charAt(i);
alert(1);
if ((varArray[i] < '0' || varArray[i] > '9') && (i != 17)) {
return false;
} else if (i < 17) {
varArray[i] = varArray[i]*factorArr[i];
}
}
if (intStrLen == 18) {
//check date
var date8 = idNumber.substring(6,14);
alert(2);
if (checkDate(date8) == false) {
return false;
}
alert(3);
// calculate the sum of the products
for(i=0;i<17;i++) {
lngProduct = lngProduct + varArray[i];
}
// calculate the check digit
alert(4);
intCheckDigit = 12 - lngProduct % 11;
switch (intCheckDigit) {
case 10:
intCheckDigit = 'X';
alert(5);
break;
case 11:
intCheckDigit = 0;
alert(6);
break;
case 12:
intCheckDigit = 1;
alert(7);
break;
}
// check last digit
if (varArray[17].toUpperCase() != intCheckDigit) {
alert(8);
return false;
}
}
else{ //length is 15
//check date
alert(9);
var date6 = idNumber.substring(6,12);
if (checkDate(date6) == false) {
alert(10);
return false;
}
}
return true;
},
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 "symd" :
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;
case "ymdh" :
m = op.match(new RegExp("^((//d{4})|(//d{2}))([-])(//d{1,2})//4(//d{1,2})//s+(//d{1,2}):(//d{1,2}):(//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));
hour = m[7]*1;
minute = m[8]*1;
second = m[9]*1;
if(hour>=24) return false;
if(minute>=60) return false;
if(second>=60) return false;
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;}
},
IsDayHM : function(op, formatString) {
return parseDate(op, formatString, "hm") != null;
},
IsDayHMS : function(op, formatString) {
return parseDate(op, formatString, "hms") != null;
}
}
一个关于form表单验证的js
最新推荐文章于 2024-07-14 16:46:07 发布