通用表单验证函数 - FormCheck JavaScript Function

以前在开发项目的时候,在没使用EXTJS之前,写了这个通用的表单验证函数。

在实际开发过程中,使用非常简单,确实大幅提高了开发效率

现在虽然用不到了,但扔了感觉可惜,留在这里当个纪念吧!


  通用表单验证函数使用说明 
 
  Author : netwild   最后更新日期:2009-07-02 
 
  一、函数功能 
 
  在编写WEB应用时,经常需要对各种表单进行输入验证,为了节省开发时间,增加开发效率,编写统一验证函数。 
 
  二、函数说明 
 
  function chkForm(object form) 
 
  参数form为表单对象,支持两种方式: 
 
  1、表单对象:<form onsubmit="return chkForm(this)"> 
 
  2、表单名称:<form name="form1" onsubmit="return chkForm('form1')"> 
 
  返回值:boolean 
 
  三、与验证相关的属性 
 
    属性名称 属性类型   说明           默认值   适用控件                       
    enNull   扩展属性   是否允许为空       true     input(text、radio、checkbox)、textarea、select 
    len   扩展属性   输入字符个数范围     0,2000     input(text)、textarea               
    temp   扩展属性   验证模版         无       input(text)、textarea               
    match   扩展属性   自定义规则       无       input(text)、textarea               
    skip   扩展属性   跳过验证         false     input(radio、checkbox)、select           
    title   标准属性   字段名称         无       任何控件                       
 
 
  四、属性说明 
 
  1、enNull 
 
  例如: <input type="text" name="inpUname" enNull="false" title="用户名" />   //表示该输入框不允许为空 
 
  <input type="radio" name="rdoSex" enNull="false" title="性别" />   //表示该组单选框为必选项 
  <input type="radio" name="rdoSex"  />   //在首个标签上注明即可 
 
  <input type="checkbox" name="chbDev" enNull="false" title="技术" />   //表示该组复选框为必选项 
  <input type="checkbox" name="chbDev"  />   //在首个标签上注明即可 
  <input type="checkbox" name="chbDev"  /> 
 
  2、len 
 
  例如: <input type="text" name="inpUname" len="6,18" title="用户名" />   //表示输入的字符个数在6到18个之间
  //使用len属性,可以省略enNull属性
 
  3、temp 
 
  取值范围: 
 
  number:匹配数值型,包括整数、负数、小数,并且小数位数不超过6位。 
 
  例如:423、-376、57.89、-0.34 都符合;sds、422.、.237 都不符合 
 
  number5:匹配数值型,包括整数、负数、小数,并且小数位数不超过5位。 
 
  number4:匹配数值型,包括整数、负数、小数,并且小数位数不超过4位。 
 
  number3:匹配数值型,包括整数、负数、小数,并且小数位数不超过3位。 
 
  number2:匹配数值型,包括整数、负数、小数,并且小数位数不超过2位。 
 
  number1:匹配数值型,包括整数、负数、小数,并且小数位数不超过1位。 
 
  number(len1,len2):匹配数值型,包括整数、负数、小数,并且整数部分最长不超过len1,小数部分最长不超过len2 新!
 
  money:匹配货币型,包括整数、负数、1位或2位小数 
 
  int:匹配数值型,包括整数、负数,不匹配小数 
 
  uint:匹配无符号数值型,包括正整数,不匹配小数 
 
  var:匹配变量命名规范,可包括:英文字母、数字和下划线,并且必须以英文字母开头 
 
  string:匹配字符型,包括任何字符及换行符 
 
  date:匹配标准的10位长度的日期型,例如:2009-06-24 
 
  time:匹配标准的8位长度的时间型,例如:16:51:08 
 
  datetime:匹配19位长度的日期+时间型 
 
  timestep:匹配0-60之间的整数 
 
  weekstep:匹配0-7之间的整数 
 
  monthstep:匹配0-30之间的整数 
 
  exp01:表达式:str='value' 
 
  input:匹配除英文双引号、单引号之外的任意字符 
 
  parame:匹配除英文双引号、单引号、@ # % & * . ? 和空格之外的任意字符 
 
  4、match 
 
  该属性值为标准的JavaScript正则表达式。但不包括:^(起始符)、$(截止符) 
 
  为统一验证规则,除非极特殊情况之外,不建议直接使用match属性进行验证。 
 
  5、skip 
 
  该属性表示“跳过验证”,通常用于单选框、复选框及下拉框中,使用了enNull属性,但其中某些选项需要例外的情况 
 
  例如: <select title="城市" enNull="false"> 
  <option skip="true">--- 辽宁省 ---</option> 
  <option>沈阳</option> 
  <option>辽阳</option> 
  <option>大连</option> 
  <option skip="true">--- 广东省 ---</option> 
  <option>广州</option> 
  <option>深圳</option> 
  <option>东莞</option> 
  <option skip="true">--- 山东省 ---</option> 
  <option>济南</option> 
  <option>青岛</option> 
  </select> 
 
  //该下拉框为必选项,但只想选择其中的“市”,因此为“省”增加属性:skip=true,即使选择该项,也做无效处理。
 
  6、title 
 
  控件名称描述 
 
  对于单选框和复选框来说,仅在第一个标签上设置该属性即可,其他同名的一组内的标签将默认继承第一个标签的设置。

 

 

  1 /**  
  2 * @fileoverview 表单验证相关函数  
  3 * JavaScript.  
  4 *  
  5 * @author 网无忌 netwild@163.com  
  6 * @version 1.0  
  7 */   
  8   
  9 /**  
 10 * 验证表单输入规则(自定义)  
 11 * @type boolean  
 12 * @returns 验证结果 true/false  
 13 */   
 14 var formChkDefaultMatch = {enNull:true,len:'0,2000',match:'',tempList:[]}   
 15   
 16 //--- 设置 验证模版结束 --------------   
 17   
 18 function arrLook(prmArr,prmSub){var index = -1;for(var i=0;i<prmArr.length;i++){if(prmArr[i]==prmSub){index = i;break;}}return index;}   
 19 function chkForm(prmFormName){   
 20     var frmObj = (typeof(prmFormName) == "string")?document.getElementsByName(prmFormName)[0]:prmFormName;   
 21     if(typeof(frmObj) == "undefined"return false;   
 22     var frmEmts = frmObj.elements;   
 23     var frmEmtsCnt = frmEmts.length;   
 24     var checkObjList = [],arrObjList = [];   
 25     var emtChkRet;   
 26     for(var i=0;i<frmEmtsCnt;i++){   
 27         var emtObj = frmEmts[i];   
 28         var emtObjTagName = emtObj.tagName.toLowerCase();   
 29         if(emtObjTagName == "input" || emtObjTagName == "textarea"){   
 30             var emtObjType = (emtObj.type == undefined)?"text":emtObj.type;   
 31             if(emtObjType == "text"){   
 32                 emtChkRet = chkInputText(emtObj);   
 33                 if(!emtChkRet.value){alert(emtChkRet.desc);emtObj.focus();return false}   
 34             }else if(emtObjType == "radio" || emtObjType == "checkbox"){   
 35                 if(arrLook(checkObjList,emtObj.name) > -1continue;   
 36                 checkObjList.push(emtObj.name);   
 37                 emtChkRet = chkInputCheck(frmObj,emtObj);   
 38                 if(!emtChkRet.value){alert(emtChkRet.desc);emtObj.focus();return false}   
 39             }   
 40         }else if(emtObjTagName == "select"){   
 41             emtChkRet = chkSelect(emtObj);   
 42             if(!emtChkRet.value){alert(emtChkRet.desc);emtObj.focus();return false}   
 43         }   
 44     }   
 45     return true;   
 46 }   
 47   
 48 /**  
 49 * 验证文本框  
 50 */   
 51 function chkInputText(prmObj){   
 52     var tmpValue = prmObj.value;   
 53     var tmpLen = prmObj.value.length;   
 54     var tmpDesc = (prmObj.title == "")?prmObj.name:prmObj.title;   
 55     var defEnNull = (prmObj.enNull == undefined)?formChkDefaultMatch.enNull:(prmObj.enNull!="false");   
 56     var defLen = (prmObj.len == undefined)?formChkDefaultMatch.len:prmObj.len;    
 57     var defMatch = (prmObj.temp == undefined)?formChkDefaultMatch.match:prmObj.temp;   
 58     var defMatchDesc = "";   
 59     if(defMatch != "" && /number\(\d+\,\d+\)/.test(defMatch)){var m=defMatch.match(/number\((\d+)\,(\d+)\)/);if(parseInt(m[2])>0){defMatch="(\\-)?[\\d\\,]{1,"+m[1]+"}(\\.(\\d){1,"+m[2]+"})?";defMatchDesc="允许的类型:数值型,并且整数位数最大 "+m[1]+" 位,小数位数最大 "+m[2]+" 位"}else{defMatch="(\\-)?[\\d\\,]{1,"+m[1]+"}";defMatchDesc="允许的类型:整数型,并且整数位数最大 "+m[1]+" 位"}}   
 60     else if(defMatch != ""){for(var i=0;i<formChkDefaultMatch.tempList.length;i++if(defMatch == formChkDefaultMatch.tempList[i][0]) {defMatch = formChkDefaultMatch.tempList[i][1];defMatchDesc = formChkDefaultMatch.tempList[i][2];break}}   
 61     defMatch = (prmObj.match == undefined)?defMatch:prmObj.match;   
 62     if((!defEnNull) && (tmpValue == "")) return {desc:''+tmpDesc+'”不允许为空!',value:false};   
 63     if(tmpLen<defLen.split(",")[0|| tmpLen>defLen.split(",")[1]) return {desc:''+tmpDesc+'”的输入长度不符合要求['+defLen+']!',value:false};   
 64     if(defMatch != "" && tmpValue != "")    
 65         try{if(!eval("/^"+defMatch+"$/").test(tmpValue))return {desc:''+tmpDesc+'”的输入格式不符合要求!\t\n\t\n'+defMatchDesc,value:false}}   
 66         catch(e){return {desc:''+tmpDesc+'”的验证规则错误!',value:false}}   
 67     return {desc:tmpDesc,value:true};   
 68 }   
 69 /**  
 70 * 验证单选、复选  
 71 */   
 72 function chkInputCheck(frmObj,prmObj){   
 73     var tmpObjs = frmObj.all[prmObj.name];   
 74     var tmpDesc = (prmObj.title == "")?prmObj.name:prmObj.title;   
 75     var enNull = (prmObj.enNull == undefined)?formChkDefaultMatch.enNull:(prmObj.enNull!="false");   
 76     var tmpObj,isChecked = false;   
 77     for(var i=0;i<tmpObjs.length;i++){   
 78         tmpObj = tmpObjs[i];   
 79         if((tmpObj.skip != "true"&& tmpObj.checked) isChecked = true;   
 80         if((!enNull) && isChecked) return {desc:tmpDesc,value:true}   
 81     }   
 82     if(enNull) return {desc:tmpDesc,value:true}   
 83     else return {desc:'请至少选择“'+tmpDesc+'”其中一个选项!',value:false}   
 84 }   
 85 /**  
 86 * 验证下拉框  
 87 */   
 88 function chkSelect(prmObj){   
 89     var tmpDesc = (prmObj.title == "")?prmObj.name:prmObj.title;   
 90     var enNull = (prmObj.enNull == undefined)?formChkDefaultMatch.enNull:(prmObj.enNull!="false");   
 91     if(enNull) return {desc:tmpDesc,value:true}   
 92     if(prmObj.options.length < 1return {desc:''+tmpDesc+'”的候选项为空!',value:false}   
 93     if(prmObj.options[prmObj.options.selectedIndex].skip == "true"return {desc:'请至少选择“'+tmpDesc+'”其中一个选项!',value:false}   
 94     else return {desc:tmpDesc,value:true}   
 95 }   
 96 /**  
 97 * 验证日期范围是否合理  
 98 */   
 99 function chkDateRange(prmDate1,prmDate2){   
100     var pat = /\d{4}\-\d{2}\-\d{2}/;   
101     if(!pat.test(prmDate1)) return false;   
102     if(!pat.test(prmDate2)) return false;   
103     if(prmDate1 > prmDate2) return false;   
104     return true;   
105 }   
106 /**  
107 * 验证两个文本框输入值是否相同(常用于验证密码一致)  
108 */   
109 function chkPassInput(prmPass1,prmPass2){   
110     if(prmPass1 != prmPass2) return false   
111     return true;   
112 }  

 

 

posted @ 2010-11-30 20:13  网无忌  阅读(4531)  评论(1编辑  收藏  举报