2008年5月1日星期四

通用数据校验JavaScript脚本(适用于IE)

/*
作者:沈健(常熟理工学院计算机系),jimshen@21cn.com
编写本JavaScript脚本的原因在于为表单验证提供一个便于使用的可重用的代码
本代码的版权归作者所有,你可以在任何场合使用本代码,但必须保留该代码的版权声明
在使用过程中遇到的问题或者任何建议可通过电子邮件反馈给作者
*/

//类型模式,用以正则表达式检查表单内容是否满足要求
var ALPHABETIC=0;        //只能使用英文字母
var ALPHANUM=1;            //只能使用英文字母、数字和下划线
var PASSWORD=2;            //能够使用除'、"以及空白字符以外的其他字符
var EMAIL=3;            //符合Email地址格式(用户名@域名/IP地址)
var NOLIMIT=4;            //无限制,可使用任何字符
var NORETURN=5;            //除换行(\n)之外的任何字符
                        //缺省情况为ALPHABETIC

//错误代号
var EMPTY=0;            //表单元素(文本类)输入为空
var TOO_SHORT=1;        //文本长度太短
var TOO_LONG=2;            //文本长度太长
var ILLEGLE=3;            //文本含有非法字符
var WRONG_EMAIL=4;        //电子邮件地址格式错误
var NO_SELECT=5;        //表单元素(单选、复选按钮等)未选择
var TOO_FEW_SELECT=6;    //复选按钮组或者复选列表框选择的数据项数量太少
var TOO_MANY_SELECT=7;    //复选按钮组或者复选列表框选择的数据项数量太多

//产生警告信息
//formName: 表单元素名称
//errorCode: 错误代号
//number: 可选的数量词,表示文本长度或者选项个数需要符合的条件
function warning(formName,errorCode,number){
    var _msg;
    var errorMsg=new Array(8);
    errorMsg[0]="为空,请填写完整!";
    errorMsg[1]="长度不符合要求!长度不能小于";
    errorMsg[2]="长度不符合要求!长度不能大于";
    errorMsg[3]="包含非法的字符!请参照表单填写说明进行修改!";
    errorMsg[4]="电子邮件地址不正确,请填写正确!";
    errorMsg[5]="没有选择,请选择!";
    errorMsg[6]="选择的项数不能少于";
    errorMsg[7]="选择的项数不能多于";
    if(number==null)
        number="";
    _msg=formName+errorMsg[errorCode]+number;
    window.alert(_msg);
    return false;
}

//验证表单元素内容是否符合要求,如果满足返回true,否则返回false
//formObj: 表单元素
//formName: 表单名称,用于显示在错误信息中,应提供用户能够理解的文字
//contentType: 类型模式,用以正则表达式检查,使用预定义的符号,对于文本类以外的元素无意义,默认为只允许英文字母
//minLen: 可选,文本最小长度,对于单选按钮无意义,对于复选按钮组表示最少选择的数量
//maxLen: 可选,文本最大长度,对于单选按钮无意义,对于复选按钮组表示最多选择的数量
//如果不提供minLen和maxLen则不检查长度或个数

//各种检查格式:
// 文本 validate(form1.formname,"文字描述",ALPHANUM,最小长度,最大长度)
// 密码 validate(form1.formname,"文字描述",PASSWORD,最小长度,最大长度)
// 文本-电子邮件 validate(form1.email,"电子邮件",EMAIL)
// 文本域 validate(form1.formname,"文字描述",NOLIMIT,最小长度,最大长度)
// 单选按钮 validate(form1.formname,"文字描述")
// 单个复选按钮 validate(form1.formname,"文字描述")
// 复选按钮组 validate(form1.formname,"文字描述","",最少个数,最大个数)
// 下拉列表 validate(form1.formname,"文字描述")
// 单选列表框 validate(form1.formname,"文字描述")
// 多选列表框 validate(form1.formname,"文字描述","",最少个数,最大个数)

function validate(formObj,formName,contentType,minLen,maxLen){
    var str;
    var regex;
    var formType=formObj.type;
    if(formType==null)
        formType=formObj[0].type;
    var count;
    if(contentType==null)
        contentType=ALPHABETIC;
    switch(contentType){
        case ALPHABETIC:
            regex=/^[A-Za-z]*$/;
            break;
        case ALPHANUM:
            regex=/^[\w]*$/;
            break;
        case PASSWORD:
            regex=/^[^\'\"\s]*$/;
            break;
        case NOLIMIT:
            regex=/^[\u0000-\uffff]*$/;
            break;
        case NORETURN:
            regex=/^.*$/;
            break;
        case EMAIL:
            str=formObj.value;
            if(str==null || str==""){
                return warning(formName,EMPTY);
            }
            if(!checkEmail(str)){
                return warning(formName,WRONG_EMAIL);
            }else
                return true;
            break;
        default:
            regex=/^[\w]*$/;
            break;
    }
    switch(formType){
        case "text":
        case "password":
        case "textarea":
        case "file":
            str=formObj.value;
            if(str==null || str==""){
                return warning(formName,EMPTY);
            }
            if(minLen!=null && minLen!=""){
                if(str.length<minLen){
                    return warning(formName,TOO_SHORT,minLen);
                }
            }
            if(maxLen!=null && maxLen!=""){
                if(str.length>maxLen){
                    return warning(formName,TOO_LONG,maxLen);
                }
            }
            if(!check(str,regex)){
                return warning(formName,ILLEGLE);
            }
            break;
        case "radio":
        case "checkbox":
            count=readButton(formObj);
            if(count==0){
                return warning(formName,NO_SELECT);
            }
            if(minLen!=null && minLen!=""){
                if(count<minLen){
                    return warning(formName,TOO_FEW_SELECT,minLen);
                }
            }
            if(maxLen!=null && maxLen!=""){
                if(count>maxLen){
                    return warning(formName,TOO_MANY_SELECT,maxLen);
                }
            }
            break;
        case "select-one":
            if(readSingle(formObj)<0){
                return warning(formName,NO_SELECT);
            }
            break;
        case "select-multiple":
            count=readMultiple(formObj);
            if(count==0){
                return warning(formName,NO_SELECT);
            }
            if(minLen!=null && minLen!=""){
                if(count<minLen){
                    return warning(formName,TOO_FEW_SELECT,minLen);
                }
            }
            if(maxLen!=null && maxLen!=""){
                if(count>maxLen){
                    return warning(formName,TOO_MANY_SELECT,maxLen);
                }
            }
            break;
    }
    return true;
}

//读取单选按钮、复选按钮、复选按钮组的数据,返回选中的选项的个数
//如果返回为0,表示未选择
function readButton(formObj){
    var count=0;
    var len=formObj.length;
    if(len!=null){
        for(i=0;i<formObj.length;i++){
            if(formObj[i].checked)
                count++;
        }
    }else if(formObj.checked)
        count=1;
    return count;
}

//返回下拉列表、单选列表中被选中数据的编号
//如果返回为-1,表示未选择
function readSingle(formObj){
    return formObj.selectedIndex;
}

//返回多选列表中被选中数据项的个数
//如果返回为0,表示未选择
function readMultiple(formObj){
    var len=formObj.length;
    var count=0;
    for(i=0;i<len;i++){
        if(formObj.options[i].selected){
            count++;
        }
    }
    return count;
}

//检查字符串是否匹配规定的正则表达式
function check(str,regex){
    var splitted=str.match(regex);
    if(splitted==null)
        return false;
    else
        return true;
}

//检查Email地址格式是否正确
function checkEmail(email){
    var splitted = email.match("^(.+)@(.+)$");
    if(splitted == null) return false;
    if(splitted[1] != null )
    {
      var regexp_user=/^\"?[\w-_\.]*\"?$/;
      if(splitted[1].match(regexp_user) == null) return false;
    }
    if(splitted[2] != null)
    {
      var regexp_domain=/^[\w-\.]*\.[A-Za-z]{2,4}$/;
      if(splitted[2].match(regexp_domain) == null)
      {
        var regexp_ip =/^\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]$/;
        if(splitted[2].match(regexp_ip) == null) return false;
      }// if
      return true;
   }
}

没有评论:

发表评论