//////////////////////////////////////////////////////////////////////////////// // name: evalform.js // version: 1.6 // author: iDog // date: Apr 7, 2001 // description: Check form inputs at client side before submit a form to server side. // note: 使用时需要在被判断的Input对象中加入属性值。 // MUST=1 说明该Input对象必填。 // isNumeric 说明该Input对象必须填写数字类型的值(不要求必填)。 // isDate 说明该Input对象必须填写日期类型(YYYY-MM-DD)的值(不要求必填)。 // isMDate 说明该Input对象必须填写日期类型(YYYY-MM)的值(不要求必填)。 // isSetLength=1 说明该Input对象填写的字符长度设定了大小(不要求必填)。 // setLength 说明该Input对象填写的字符长度的大小,要求加单位(个)(不要求必填)。 // 此处还提供了另外几个函数: // isDate(objTgt) 判断传入对象objTgt中填写的值(objTgt.value)是否为日期类型。 // judgeLeapYear(yearStr) 是否为闰年。 // judgeSmallMonth(monthStr) 是否为小月。 // isInt(objNumber) 是否为整数。 // isModified(eForm) 页面是否有过修改。 //////////////////////////////////////////////////////////////////////////////// // // 2003/7/1 章仙军 加入新的功能 : // 允许日期输入为 2003-1-1 2002-1-1 2002,1,1 2002、1、1 2002/1/1 2002年1月1日 2000-1-1 等 // // 表单提交之前,在页面上判断输入的合法性(必填MUST、数字isNumeric、日期isDate等等)。 function evalForm(formName){ var isLeapYear=false; /*闰年[二月为29天]*/ var isSmallMonth=false; /*小月[该月为30天]*/ if (!document.forms(formName)) return false; for (i=0;i=Math.pow(10,maxV)||Math.abs(objTgtValue)maxV||objTgtValue.valueOf()= 0) { if(objTgt.title!=""){ errAlert("["+objTgt.title+"]项只能输入英文字符a-z,A-Z数字0-9以及下划线!"); }else{ errAlert("只能输入英文字符a-z,A-Z数字0-9以及下划线!"); } focusItem(objTgt); return false; } } //判断文本框所输入的字符是否不能输入数字! if(objTgt.isName==1){ r2 = new RegExp('[^0-91234567890_.@#$%&*@#¥%^&×()]',''); if(objTgt.value.search(r2) != 0) { if(objTgt.title!=""){ errAlert("["+objTgt.title+"]项不能输入非法字符!"); }else{ errAlert("不能输入非法字符!"); } focusItem(objTgt); return false; } } //判断文本框所输入的是否是mail地址! if(objTgt.isMail==1){ r1='@'; r2 = new RegExp('[^A-Za-z0-9_.@]',''); if(objTgt.value.search(r1)<0||objTgt.value.search(r2) >= 0) { errAlert("电子邮件地址错误!请重新填写!"); focusItem(objTgt); return false; } } //判断文本框所输入的是否身份证! if(objTgt.isIDCard==1){ var birth; if(objTgt.value.length==15){ if(isNaN(objTgt.value)){ errAlert("身份证号错误!请重新填写!"); focusItem(objTgt); return false; }else{ IDYear = judgeLeapYear("19"+objTgt.value.substr(6,2)); birth = objTgt.value.substr(8,2); if(birth>12||birth<01){ errAlert("身份证号错误!请重新填写!"); focusItem(objTgt); return false; } IDMonth = judgeSmallMonth(birth); birth = objTgt.value.substr(10,2); if(birth<01||(!IDMonth&&birth>31)||(IDMonth&&birth>30)||(IDYear&&objTgt.value.substr(8,2)==02&&birth>29)||(!IDYear&&objTgt.value.substr(8,2)==02&&birth>28)){ errAlert("身份证号错误!请重新填写!"); focusItem(objTgt); return false; } } }else if(objTgt.value.length==18){ r2 = new RegExp('[^0-9Xx]',''); if(isNaN(objTgt.value.substr(0,17))||objTgt.value.substr(17,1).search(r2) >= 0){ errAlert("身份证号错误!请重新填写!"); focusItem(objTgt); return false; }else{ birth = objTgt.value.substr(6,4); if(birth>2050||birth<1900){ errAlert("身份证号错误!请重新填写!"); focusItem(objTgt); return false; } IDYear = judgeLeapYear(birth); birth = objTgt.value.substr(10,2); if(birth>12||birth<01){ errAlert("身份证号错误!请重新填写!"); focusItem(objTgt); return false; } IDMonth = judgeSmallMonth(birth); birth = objTgt.value.substr(12,2); if(birth<01||(!IDMonth&&birth>31)||(IDMonth&&birth>30)||(IDYear&&objTgt.value.substr(10,2)==02&&birth>29)||(!IDYear&&objTgt.value.substr(10,2)==02&&birth>28)){ errAlert("身份证号错误!请重新填写!"); focusItem(objTgt); return false; } } }else{ errAlert("身份证号只能是15位或者18位!请重新填写!"); focusItem(objTgt); return false; } } //判断文本框或文本域可以输入的最大,小字符数 if(objTgt.isLength==1){ if (objTgt.value.length>objTgt.maxLength){ errAlert ("["+objTgt.title+"]项所输入的最大字符数超出规定范围:"+objTgt.maxLength); focusItem(objTgt); return false; } if (objTgt.value.length0){ end=objTgt.setLength.indexOf("位",start); if(objTgt.value.length==objTgt.setLength.substring(start,end)){ result=true; break; } start=end+1; } if(result==false){ if(objTgt.title!=""){ errAlert ("["+objTgt.title+"]项所输入的字符数只能为:"+objTgt.setLength+"!"); }else{ errAlert ("所输入的字符数只能为:"+objTgt.setLength+"!"); } focusItem(objTgt); return false; } } if (objTgt.isMDate==1){ if(isMDate(objTgt)==false){return false;} }else if (objTgt.isDate==1){ if(isDate(objTgt)==false){return false;} } } } return true; } // 判断是否是日期。 function isDate(objTgt){ var inDate=objTgt.value.trim(); inDate = dealSpecNum(inDate);//处理特殊的数字字符 for(var index=0;index<2;index++){//必须处理2遍,因为replace每次找到第一个匹配的修改,然后马上中止替换 inDate = inDate.replace('-','-'); inDate = inDate.replace('—','-'); inDate = inDate.replace('、','-'); inDate = inDate.replace('/','-'); inDate = inDate.replace('.','-'); inDate = inDate.replace(',','-'); inDate = inDate.replace(',','-'); inDate = inDate.replace(' ','-'); inDate = inDate.replace(' ','-'); } inDate = inDate.replace('年','-'); inDate = inDate.replace('月','-'); inDate = inDate.replace('日',' '); inDate = inDate.trim(); if (inDate.length>=6 && inDate.length<=10 && inDate.indexOf("-")!=-1 && inDate.indexOf("-")!=inDate.lastIndexOf("-") && inDate.substring(inDate.indexOf("-")+1,inDate.lastIndexOf("-")).indexOf("-")==-1){ var inYear=parseInt(inDate.substring(0,inDate.indexOf("-"))); var inMonth=inDate.substring(inDate.indexOf("-")+1,inDate.lastIndexOf("-")); if (inMonth.substring(0,1)=="0" && inMonth.length>1) inMonth=inMonth.substring(1,inMonth.length); inMonth=parseInt(inMonth); var inDay=inDate.substring(inDate.lastIndexOf("-")+1); if (inDay.substring(0,1)=="0" && inDay.length>1) inDay=inDay.substring(1,inDay.length); inDay=parseInt(inDay); if (inYear && !(isNaN(inYear)) && inYear.toString().length==4){ var year=inYear; isLeapYear=judgeLeapYear(inYear); }else if(inYear.toString().length!=4){ errAlert("对不起,系统需要四位年 !","为了保证日期存储的准确性,系统要求所有的日期输入都使用四位数字表示年份,\n可是您在 ["+objTgt.title+"] 项中没有使用四位年输入。","重新输入 ["+objTgt.title+"] 这一项。"); focusItem(objTgt); return false; }else{ errAlert("年份填写有误 !","",""); focusItem(objTgt); return false; } if (inMonth && !(isNaN(inMonth)) && inMonth<=12 && inMonth >=1){ var month=inMonth; isSmallMonth=judgeSmallMonth(inMonth); }else{ errAlert("月份填写有误 !","表示月份的数字必须处于1到12之间,可是您在 ["+objTgt.title+"] 项中填写的 "+inMonth+" 显然不在这个范围内。","重新填写 ["+objTgt.title+"] 这一项。"); focusItem(objTgt); return false; } if (inDay && !(isNaN(inDay)) && inDay>=1 && (month==2?(isLeapYear?inDay<=29:inDay<=28):(isSmallMonth?inDay<=30:inDay<=31))){ var day=inDay; }else{ errAlert("日期填写有误 !","表示日期的数字必须处于1到31之间,而且必须满足闰年和大小月规则,\n可是您在 ["+objTgt.title+"] 项中填写的 "+inDay+" 显然不满足要求。","重新填写 ["+objTgt.title+"] 这一项。"); focusItem(objTgt); return false; } var inputDate=new Date(); if (!(Date.parse(month + "-" + day + "-" + year))){ errAlert("日期填写有误 !","为了保证日期存储的准确性,系统要求所有的日期输入都按照 YYYY-MM-DD 的格式输入,\n可是您在 ["+objTgt.title+"] 项中的输入值 ["+objTgt.value+"] 不满足输入要求。","重新输入 ["+objTgt.title+"] 这一项。"); focusItem(objTgt); return false; } }else{ errAlert("您输入的不是一个完整的日期值 !","为了保证日期存储的准确性,系统要求所有的日期输入都按照 YYYY-MM-DD 的格式输入,\n可是您在 ["+objTgt.title+"] 项中的输入值 ["+objTgt.value+"] 不满足输入要求。","重新输入 ["+objTgt.title+"] 这一项。"); focusItem(objTgt); return false; } for(var i=0;i'9')&&inDate.charAt(i)!='-'){ errAlert("您输入的不是一个有效的日期值 !","为了保证日期存储的准确性,系统要求所有的日期输入都按照 YYYY-MM-DD 的格式输入,\n可是您在 ["+objTgt.title+"] 项中的输入值 ["+objTgt.value+"] 不满足输入要求。","重新输入 ["+objTgt.title+"] 这一项。"); focusItem(objTgt); return false; } } objTgt.value = inDate; } // 判断是否是日期,并且日期格式是否为YYYY-MM。 function isMDate(objTgt){ var inDate=objTgt.value.trim(); inDate = dealSpecNum(inDate);//处理特殊的数字字符 for(var index=0;index<2;index++){//必须处理2遍,因为replace每次找到第一个匹配的修改,然后马上中止替换 inDate = inDate.replace('-','-'); inDate = inDate.replace('—','-'); inDate = inDate.replace('、','-'); inDate = inDate.replace('/','-'); inDate = inDate.replace('.','-'); inDate = inDate.replace(',','-'); inDate = inDate.replace(',','-'); inDate = inDate.replace(' ','-'); inDate = inDate.replace(' ','-'); } inDate = inDate.replace('年','-'); inDate = inDate.replace('月',' '); inDate = inDate.trim(); if (inDate.length>=6 && inDate.length<=7 && inDate.indexOf("-")!=-1 && inDate.indexOf("-")==inDate.lastIndexOf("-")){ var inYear=parseInt(inDate.substring(0,inDate.indexOf("-"))); var inMonth=inDate.substring(inDate.indexOf("-")+1); if (inMonth.substring(0,1)=="0" && inMonth.length>1) inMonth=inMonth.substring(1,inMonth.length); inMonth=parseInt(inMonth); if (inYear && !(isNaN(inYear)) && inYear.toString().length==4){ var year=inYear; isLeapYear=judgeLeapYear(inYear); }else if(inYear.toString().length!=4){ errAlert("对不起,系统需要四位年 !","为了保证日期存储的准确性,系统要求所有的日期输入都使用四位数字表示年份,\n可是您在 ["+objTgt.title+"] 项中没有使用四位年输入。","重新输入 ["+objTgt.title+"] 这一项。"); focusItem(objTgt); return false; }else{ errAlert("年份填写有误 !","",""); focusItem(objTgt); return false; } if (inMonth && !(isNaN(inMonth)) && inMonth<=12 && inMonth >=1){ var month=inMonth; isSmallMonth=judgeSmallMonth(inMonth); }else{ errAlert("月份填写有误 !","表示月份的数字必须处于1到12之间,可是您在 ["+objTgt.title+"] 项中填写的 "+inMonth+" 显然不在这个范围内。","重新填写 ["+objTgt.title+"] 这一项。"); focusItem(objTgt); return false; } }else{ errAlert("您输入的不是一个系统要求的日期值 !","为了保证日期存储的准确性,系统要求该处的日期输入都按照 YYYY-MM 的格式输入,\n可是您在 ["+objTgt.title+"] 项中的输入值 ["+objTgt.value+"] 不满足输入要求。","重新输入 ["+objTgt.title+"] 这一项。"); focusItem(objTgt); return false; } for(var i=0;i'9')&&inDate.charAt(i)!='-'){ errAlert("您输入的不是一个有效的日期值 !","为了保证日期存储的准确性,系统要求所有的日期输入都按照 YYYY-MM-DD 的格式输入,\n可是您在 ["+objTgt.title+"] 项中的输入值 ["+objTgt.value+"] 不满足输入要求。","重新输入 ["+objTgt.title+"] 这一项。"); focusItem(objTgt); return false; } } objTgt.value = inDate; } // 判断闰年。 function judgeLeapYear(yearStr){ if(!(isNaN(yearStr)) && yearStr.toString().length==4 && (yearStr%100==0?yearStr%400==0:yearStr%4==0)) return true; return false; } // 判断小月。 function judgeSmallMonth(monthStr){ if(monthStr==4||monthStr==6||monthStr==9||monthStr==11) return true; return false; } // 是否整数。 function isInt(objNumber){ if(!isNaN(objNumber)){ if(Math.round(objNumber)==objNumber){ return true; }else{ return false; } }else{ return false; } } // 使INPUT对象获取焦点。 function focusItem(objTgt){ //objTgt.select(); objTgt.focus(); } // 判断页面是否修改过。 // 传入要判断页面的对象 -- eForm。 // 返回值: // true -- 曾经修改过 // false -- 没有修改过 function isModified(eForm){ var iNumElems = eForm.elements.length; for (var i=0;i