/*
作者:沈健(常熟理工学院计算机系),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;
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;
}
}