关于编写通用脚本验证的一点思路

想写一个比较通用的提交表单时的脚本验证程序,因为一个个的编写每个字段的验证实在是太麻烦了,昨天花了两个小时想了一下,感觉一个通用的验证应该有如下特点:

1 不应该和<html>代码有任何关联,例如通过向表单元素上增加自己的属性,这样会使html代码可读性降低。如果使用服务器端tag(如struts的html标签),可能连编译都过不去。

2 错误信息展示方式应该是可以扩充的,用mvc的观点来说就是view层可以是多个,举个例子,我们既可以使用alert语句输出,也可以在页面特定的位置输出。

3 易于使用,如果配置的代码比不用时的代码还要复杂,就失去了意义,同时应该使使用者容易理解

 

4 支持服务器端验证,可以通过ajax等技术实现

 

简单 想了一下,暂时采用在页面上编写一个js对象的方式作为配置文件的定义:

例如:

var checkRegular=
        [
          { elementId:"jhmc",
            elementType:"inputText",
            rules:[  {typeName:"notEmpty",errorMsg:"名称字段不能为空!"},
                     {typeName:"maxLength",typeValue:"16",errorMsg:"名称字段不能多于8个汉字!"}
                   ]
          },
          { elementId:"ssnf",
            elementType:"inputText",
            rules:[  {typeName:"notEmpty",errorMsg:"年份字段不能为空!"},
                      {typeName:"isInteger",errorMsg:"年份字段必须为大于零的整型数字!"}
                   ]
          },
          { elementId:"sqyy",
            elementType:"area",
            rules:[  {typeName:"notEmpty",errorMsg:"申请原因字段不能为空!"}, 
                      {typeName:"maxLength",typeValue:"300",errorMsg:"申请原因字段长度不能多于150个汉字"}
                   ]
          }

 

       ];

通过配置可以进行各种验证类型的匹配选择,进行验证,并将错误信息作为一个数组返回,此时可以选择不同的展示方式去展示错误信息。

下面是我写的一段整合到dojo中的验证程序代码,此代码定义了一个js类,在类的check方法中接收一个上面定义的配置文件类型的js对象,然后根据规则进行判断,将错误信息返回。大家觉得这种方式是否可取呢??

 

dojo.provide("dojo.commonValidate.CommonValidator");
dojo.commonValidate.CommonValidator =function(){
 


}
dojo.commonValidate.CommonValidator.prototype.check=function(regular){
  var resultArray=[];
  //循环遍历每一个配置对象中的项,分别进行验证,并返回验证信息
  for(var i=0;i<regular.length;i++){
      //由于如果需要验证一组chekBox的话,需要通过名称进行验证,所以这里有可能是id,也有可能是name
      var elementId=regular[i].elementId;
      var elementType=regular[i].elementType;
      var checkedValue=this.getCheckedValue(regular[i]);
      //得到增加到一个元素上的验证规则数组
      var rules=regular[i].rules;
      for(var j=0;j<rules.length;j++){
           var rule= rules[j];
           var result=this.checkValidate(checkedValue,rule);
           //如果针对于一个字段的验证返回不成功,则会中止下面的验证,并将错误信息存入错误结果集合
           if(result.isPass==false){
              resultArray[resultArray.length++]=result;
              break;
           }
      }    
  }
 
   
   return this.getErrorMessage(resultArray);
}
//根据验证结果集合 里的数据,生成展示数据
dojo.commonValidate.CommonValidator.prototype.getErrorMessage=function(resultArray){
   var returnObj={isPass:true,message:""};
   if(resultArray.length>0){
     returnObj.message+="您输入的信息在格式上存在如下问题:/n/n";
   }
   for(var i=0;i<resultArray.length;i++){
       returnObj.isPass=false;
       
       returnObj.message+=resultArray[i].msg+"/n/n";
   }
   return returnObj;
}
dojo.commonValidate.CommonValidator.prototype.getCheckedValue=function(element){
    var elementId=element.elementId;
    var elementType=element.elementType;
    //判断当前元素的类型,如果是一般的类型,则使用document.getElementById
    if(elementType!="checkBox"){
      var element=document.getElementById(elementId);
      if(element!=null){
         var value=element.value;
         return value;
      }
    }
}

dojo.commonValidate.CommonValidator.prototype.checkValidate=function(checkedValue,rule){
    //当前规则是进行非空验证的,则会转向非空验证处理
    if(rule.typeName=="notEmpty"){
       if(checkedValue==null||checkedValue.length<=0){
          return {"isPass": false,msg:rule.errorMsg};
       }
       else{
          return {"isPass": true,msg:"检测通过"};
       }
    }
    else
      //如果是进行最大长度验证,则会转向最大长度验证处理代码
       if(rule.typeName=="maxLength"){
          if(checkedValue!=null&&checkedValue.length<=parseInt(rule.typeValue)){
            return {"isPass": true,msg:"检测通过"};
          }
          else{
           
            return {"isPass": false,msg:rule.errorMsg};
          }
       }
      
       else
           //如果是进行整型数字验证,则会转向整型验证代码
           if(rule.typeName=="isInteger"){
              if(!checkedValue.match(/^[0-9]*[1-9][0-9]*$/)){
                 return {"isPass": false,msg:rule.errorMsg};
              }
             
              return {"isPass": true,msg:"检测通过"};
            
           }
     
      return {"isPass": false,msg:"没有找到可匹配的验证规则!!"};    
          
      
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值