表单验证类 Validator使用说明

表单的验证一直是网页设计者头痛的问题,我佛山人编写的表单验证类 Validator就是为解决这个问题而写的,旨在使设计者从纷繁复杂的表单验证中解放出来,把精力集中于网页的设计和功能上的改进上。Validator是基于JavaScript技术的伪静态类和对象的自定义属性,可以对网页中的表单项输入进行相应的验证,允许同一页面中同时验证多个表单,熟悉接口之后也可以对特定的表单项甚至仅仅是某个字符串进行验证。因为是伪静态类,所以在调用时不需要实例化,直接以"类名+.语法+属性或方法名"来调用。此外,Validator还提供3种不同的错误提示模式,以满足不同的需要。 
Validator目前可实现的验证类型有: 
1.是否为空;
2.中文字符;
3.双字节字符
4.英文;
5.数字;
6.整数;
7.实数;
8.Email地址;
9.使用HTTP协议的网址;
10.电话号码;
11.货币;
12.手机号码;
13.邮政编码;
14.身份证号码(1.05增强);
15.QQ号码;
16.日期;
17.符合安全规则的密码;
18.某项的重复值;
19.两数的关系比较;
20.判断输入值是否在(n, m)区间;
21.输入字符长度限制(可按字节比较);
22.对于具有相同名称的单选按钮的选中判断;
23.限制具有相同名称的多选按钮的选中数目;
24.自定义的正则表达式验证;
25.文件上传格式过滤(1.04新增)。

语法:accept="string" 
类型:字符串。 可选。 
说明:设定表单项输入过滤,多用于type="file" 的上传控件,以限制允许上传的文件类型。该属性仅当dataType属性值为Filter时起作用。

语法:dataType="Require | Chinese | English | Number | Integer | Double | Email | Url | Phone | Mobile | Currency | Zip | IdCard | QQ | Date | SafeString | Repeat | Compare | Range | Limit | LimitB | Group | Custom | Filter "

类型:字符串。必选。 
说明:用于设定表单项的输入数据验证类型。 
选值说明: 
可选值 验证功能 
Require 必填项 
Chinese 中文 
English 英文

Number 数字 
Integer 整数 
Double 实数 
Email    Email地址格式 
Url    基于HTTP协议的网址格式 
Phone    电话号码格式 
Mobile 手机号码格式 
Currency 货币格式 
Zip    邮政编码 
IdCard    身份证号码 
QQ    Q号码 
Date    日期 
SafeString 安全密码 
Repeat    重复输入 
Compare 关系比较 
Range    输入范围 
Limit    限制输入长度 
LimitB    限制输入的字节长度 
Group    验证单/多选按钮组 
Custom 自定义正则表达式验证 
Filter    设置过滤,用于限制文件上传


验证表单 
在表单中加上onsubmit事件,触发调用Validaotor的Validate方法,代码示例: 
<form Validator.Validate(this,3)" action="your_application_page" method="post">
... ...
</form> 
Validate方法有两个可选参数,第一个为表单对象,如果是写在表单的onsubmit事件中,可以用this指代当前表单,默认值为事件源对象;第二个参数为错误提示模式,可选值为1,2和3,默认值为1。省略第二个参数时相当于使用Validate(objForm,1),省略第一个参数时相当于Validate(this,1)。注意,不可以省略第一个参数而只写第二个参数,Validate(,2)是错误的用法。


验证输入是否Email地址 
代码示例: 
<input dataType="Email" msg="信箱格式不正确"> 

<input dataType="Custom" regexp="^\w+([-+.]\w+)*@\w+([-.]\\w+)*\.\w+([-.]\w+)*$" msg="信箱格式不正确">

Validator的必要属性是dataType和msg(区分大小写),然后根据dataType值的不同,会引发出不同的属性。因为程序中已经集成Email地址格式的正则,所以可以直接用dateType="Email"进行验证,如果对Email地址的格式有不同的限制,可以用自定义的正则来验证(参考第二段代码)。

验证下拉菜单是否选中 
代码示例: 
<select dataType="Require" msg="未选择所用操作系统" >
<option value="">选择您所用的操作系统</option>
<option value="Win98">Win98</option>
<option value="Win2k">Win2k</option>
<option value="WinXP">WinXP</option>
</select> 
注意,对于IE,在option中没写value属性时IE的解释引擎将自动设置其值为空,而Firefox时将自动设置其值为text属性址。例如,在示例代码中如果第一个option不写value属性,IE中将得到value为空,而Firefox为"选择您所用的操作系统"。


验证是否选中单选按钮组中的一个 
代码示例: 
广东<input value="1" type="radio">
陕西<input value="2" type="radio">
浙江<input value="3" type="radio">
江西<input value="4" type="radio" dataType="Group" msg="必须选定一个省份" > 
对于单/多选按钮组的验证,dataType属性都为Group,然后只需在按钮组的最后一个写上dataType和msg属性。
注意,要成为单/多选按钮组,它们必须具有相同的name属性值。


限制多选按钮组的选中个数 
代码示例: 
运动<input value="1" type="checkbox">
上网<input value="2" type="checkbox">
听音乐<input value="3" type="checkbox">
看书<input value="4" type="checkbox"" dataType="Group" min="2" max="3" msg="必须选择2~3种爱好"> 
要限制多选按钮组的选中个数,必须设置min和max属性。min属性用于设定选中个数的下限,max为上限,默认时min为1,max为多选按钮组的个数。

<table align="center">
<form method="get" Validator.Validate(this,2)">
<tr>
   <td>身份证号:</td><td><input dataType="IdCard" msg="身份证号错误"></td>
</tr>
    <tr>
   <td>真实姓名:</td><td><input dataType="Chinese" msg="真实姓名只允许中文"></td>
</tr>
<tr>
   <td>ID:</td><td><input dataType="Username" msg="ID名不符合规定"></td>
</tr>
<tr>
   <td>英文名:</td><td><input dataType="English" require="false" msg="英文名只允许英文字母"></td>
</tr>
    <tr>
   <td>主页:</td><td><input require="false" dataType="Url"   msg="非法的Url"></td>
</tr>
<tr>
   <td>密码:</td><td><input dataType="SafeString"   msg="密码不符合安全规则" type="password"></td>
</tr>
<tr>
   <td>重复:</td><td><input dataType="Repeat" to="Password" msg="两次输入的密码不一致" type="password"></td>
</tr>
<tr>
   <td>信箱:</td><td><input dataType="Email" msg="信箱格式不正确"></td>
</tr>
    <tr>
   <td>信箱:</td><td><input dataType="Repeat" to="Email" msg="两次输入的信箱不一致"></td>
</tr>
<tr>
   <td>QQ:</td><td><input require="false" dataType="QQ" msg="QQ号码不存在"></td>
</tr>
    <tr>
   <td>身份证:</td><td><input dataType="IdCard" msg="身份证号码不正确"></td>
</tr>
<tr>
   <td>年龄:</td><td><input dataType="Range" msg="年龄必须在18~28之间" min="18" max="28"></td>
</tr>
   <tr>
   <td>年龄1:</td><td><input require="false" dataType="Compare" msg="年龄必须在18以上" to="18" operator="GreaterThanEqual"></td>
</tr>
   <tr>
   <td>电话:</td><td><input require="false" dataType="Phone" msg="电话号码不正确"></td>
</tr>
   <tr>
   <td>手机:</td><td><input require="false" dataType="Mobile" msg="手机号码不正确"></td>
</tr>
     <tr>
   <td>生日:</td><td><input dataType="Date" format="ymd" msg="生日日期不存在"></td>
</tr>
   <tr>
   <td>邮政编码:</td><td><input dataType="Custom" regexp="^[1-9]\d{5}$" msg="邮政编码不存在"></td>
</tr>
<tr>
   <td>邮政编码:</td><td><input dataType="Zip" msg="邮政编码不存在"></td>
</tr>
<tr>
   <td>操作系统:</td><td><select dataType="Require" msg="未选择所用操作系统" ><option value="">选择您所用的操作系统</option><option value="Win98">Win98</option><option value="Win2k">Win2k</option><option value="WinXP">WinXP</option></select></td>
</tr>
<tr>
   <td>所在省份:</td><td>广东<input value="1" type="radio">陕西<input value="2" type="radio">浙江<input value="3" type="radio">江西<input value="4" type="radio" dataType="Group" msg="必须选定一个省份" ></td>
</tr>
<tr>
   <td>爱好:</td><td>运动<input value="1" type="checkbox">上网<input value="2" type="checkbox">听音乐<input value="3" type="checkbox">看书<input value="4" type="checkbox"" dataType="Group" min="2" max="3" msg="必须选择2~3种爱好"></td>
</tr>
   <td>自我介绍:</td><td><textarea dataType="Limit" max="10" msg="自我介绍内容必须在10个字之内">中文是一个字</textarea></td>
</tr>
     <td>自传:</td><td><textarea dataType="LimitB" min="3" max="10" msg="自传内容必须在[3,10]个字节之内">中文是两个字节t</textarea></td>
</tr>
    <tr>
   <td>相片上传:</td><td><input dataType="Filter" msg="非法的文件格式" type="file" accept="jpg, gif, png"></td>
</tr>
<tr>
   <td colspan="2"><input type="submit" value="确定提交"><input demo'))" value="检验模式1" type="button"><input demo'),2)" value="检验模式2" type="button"><input demo'),3)" value="检验模式3" type="button"></td>
</tr>
</form>
</table>
<script>
/*************************************************
Validator v1.05
code by 我佛山人

*************************************************/
Validator = {
Require : /.+/,
Email : /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
Phone : /^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$/,
Mobile : /^((\(\d{2,3}\))|(\d{3}\-))?13\d{9}$/,
Url : /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/,
IdCard : "this.IsIdCard(value)",
Currency : /^\d+(\.\d+)?$/,
Number : /^\d+$/,
Zip : /^[1-9]\d{5}$/,
QQ : /^[1-9]\d{4,8}$/,
Integer : /^[-\+]?\d+$/,
Double : /^[-\+]?\d+(\.\d+)?$/,
English : /^[A-Za-z]+$/,
Chinese : /^[\u0391-\uFFE5]+$/,
Username : /^[a-z]\w{3,}$/i,
UnSafe : /^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\"]*)|.{0,5})$|\s/,
IsSafe : function(str){return !this.UnSafe.test(str);},
SafeString : "this.IsSafe(value)",
Filter : "this.DoFilter(value, getAttribute('accept'))",
Limit : "this.limit(value.length,getAttribute('min'), getAttribute('max'))",
LimitB : "this.limit(this.LenB(value), getAttribute('min'), getAttribute('max'))",
Date : "this.IsDate(value, getAttribute('min'), getAttribute('format'))",
Repeat : "value == document.getElementsByName(getAttribute('to'))[0].value",
Range : "getAttribute('min') < (value|0) && (value|0) < getAttribute('max')",
Compare : "this.compare(value,getAttribute('operator'),getAttribute('to'))",
Custom : "this.Exec(value, getAttribute('regexp'))",
Group : "this.MustChecked(getAttribute('name'), getAttribute('min'), getAttribute('max'))",
ErrorItem : [document.forms[0]],
ErrorMessage : ["以下原因导致提交失败:\t\t\t\t"],
Validate : function(theForm, mode){
   var obj = theForm || event.srcElement;
   var count = obj.elements.length;
   this.ErrorMessage.length = 1;
   this.ErrorItem.length = 1;
   this.ErrorItem[0] = obj;
   for(var i=0;i<count;i++){
    with(obj.elements[i]){
     var _dataType = getAttribute("dataType");
     if(typeof(_dataType) == "object" || typeof(this[_dataType]) == "undefined") continue;
     this.ClearState(obj.elements[i]);
     if(getAttribute("require") == "false" && value == "") continue;
     switch(_dataType){
      case "IdCard" :
      case "Date" :
      case "Repeat" :
      case "Range" :
      case "Compare" :
      case "Custom" :
      case "Group" : 
      case "Limit" :
      case "LimitB" :
      case "SafeString" :
      case "Filter" :
       if(!eval(this[_dataType])) {
        this.AddError(i, getAttribute("msg"));
       }
       break;
      default :
       if(!this[_dataType].test(value)){
        this.AddError(i, getAttribute("msg"));
       }
       break;
     }
    }
   }
   if(this.ErrorMessage.length > 1){
    mode = mode || 1;
    var errCount = this.ErrorItem.length;
    switch(mode){
    case 2 :
     for(var i=1;i<errCount;i++)
      this.ErrorItem[i].style.color = "red";
    case 1 :
     alert(this.ErrorMessage.join("\n"));
     this.ErrorItem[1].focus();
     break;
    case 3 :
     for(var i=1;i<errCount;i++){
     try{
      var span = document.createElement("SPAN");
      span.id = "__ErrorMessagePanel";
      span.style.color = "red";
      this.ErrorItem[i].parentNode.appendChild(span);
      span.innerHTML = this.ErrorMessage[i].replace(/\d+:/,"*");
      }
      catch(e){alert(e.description);}
     }
     this.ErrorItem[1].focus();
     break;
    default :
     alert(this.ErrorMessage.join("\n"));
     break;
    }
    return false;
   }
   return true;
},
limit : function(len,min, max){
   min = min || 0;
   max = max || Number.MAX_VALUE;
   return min <= len && len <= max;
},
LenB : function(str){
   return str.replace(/[^\x00-\xff]/g,"**").length;
},
ClearState : function(elem){
   with(elem){
    if(style.color == "red")
     style.color = "";
    var lastNode = parentNode.childNodes[parentNode.childNodes.length-1];
    if(lastNode.id == "__ErrorMessagePanel")
     parentNode.removeChild(lastNode);
   }
},
AddError : function(index, str){
   this.ErrorItem[this.ErrorItem.length] = this.ErrorItem[0].elements[index];
   this.ErrorMessage[this.ErrorMessage.length] = this.ErrorMessage.length + ":" + str;
},
Exec : function(op, reg){
   return new RegExp(reg,"g").test(op);
},
compare : function(op1,operator,op2){
   switch (operator) {
    case "NotEqual":
     return (op1 != op2);
    case "GreaterThan":
     return (op1 > op2);
    case "GreaterThanEqual":
     return (op1 >= op2);
    case "LessThan":
     return (op1 < op2);
    case "LessThanEqual":
     return (op1 <= op2);
    default:
     return (op1 == op2);            
   }
},
MustChecked : function(name, min, max){
   var groups = document.getElementsByName(name);
   var hasChecked = 0;
   min = min || 1;
   max = max || groups.length;
   for(var i=groups.length-1;i>=0;i--)
    if(groups[i].checked) hasChecked++;
   return min <= hasChecked && hasChecked <= max;
},
DoFilter : function(input, filter){
return new RegExp("^.+\.(?=EXT)(EXT)$".replace(/EXT/g, filter.split(/\s*,\s*/).join("|")), "gi").test(input);
},
IsIdCard : function(number){
   var date, Ai;
   var verify = "10x98765432";
   var Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
   var area = ['','','','','','','','','','','','北京','天津','河北','山西','内蒙古','','','','','','辽宁','吉林','黑龙江','','','','','','','','上海','江苏','浙江','安微','福建','江西','山东','','','','河南','湖北','湖南','广东','广西','海南','','','','重庆','四川','贵州','云南','西藏','','','','','','','陕西','甘肃','青海','宁夏','新疆','','','','','','台湾','','','','','','','','','','香港','澳门','','','','','','','','','国外'];
   var re = number.match(/^(\d{2})\d{4}(((\d{2})(\d{2})(\d{2})(\d{3}))|((\d{4})(\d{2})(\d{2})(\d{3}[x\d])))$/i);
   if(re == null) return false;
   if(re[1] >= area.length || area[re[1]] == "") return false;
   if(re[2].length == 12){
    Ai = number.substr(0, 17);
    date = [re[9], re[10], re[11]].join("-");
   }
   else{
    Ai = number.substr(0, 6) + "19" + number.substr(6);
    date = ["19" + re[4], re[5], re[6]].join("-");
   }
   if(!this.IsDate(date, "ymd")) return false;
   var sum = 0;
   for(var i = 0;i<=16;i++){
    sum += Ai.charAt(i) * Wi[i];
   }
   Ai += verify.charAt(sum%11);
   return (number.length ==15 || number.length == 18 && number == Ai);
},
IsDate : function(op, formatString){
   formatString = formatString || "ymd";
   var m, year, month, day;
   switch(formatString){
    case "ymd" :
     m = op.match(new RegExp("^(("));
     if(m == null ) return false;
     day = m[6];
     month = m[5]*1;
     year = (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3], 10));
     break;
    case "dmy" :
     m = op.match(new RegExp("^("));
     if(m == null ) return false;
     day = m[1];
     month = m[3]*1;
     year = (m[5].length == 4) ? m[5] : GetFullYear(parseInt(m[6], 10));
     break;
    default :
     break;
   }
   if(!parseInt(month)) return false;
   month = month==0 ?12:month;
   var date = new Date(year, month-1, day);
        return (typeof(date) == "object" && year == date.getFullYear() && month == (date.getMonth()+1) && day == date.getDate());
   function GetFullYear(y){return ((y<30 ? "20" : "19") + y)|0;}
}
}
</script>

内容概要:本文深入研究了基于最优滑模控制的永磁同步电机(PMSM)调速系统模型,重点利用Simulink工具搭建并仿真了该控制系统的动态响应特性。文章系统阐述了最优滑模控制策略的设计原理,突出其在削弱传统滑模控制固有抖振现象、增强系统鲁棒性方面的显著优势。通过与传统滑模控制方法的对比实验,充分验证了所提出方法在调速精度、抗外部干扰能力以及动态响应速度等方面的优越性能。研究内容涵盖PMSM数学建模、滑模面构造、最优控制律推导、Lyapunov稳定性分析、参数整定及Simulink仿真验证等完整环节,形成了一套严谨的控制算法设计与实现流程。; 适合人群:具备自动控制原理、现代控制理论基础和MATLAB/Simulink仿真操作能力,从事电机驱动控制、电力电子与电力传动、运动控制或自动化等相关领域研究的工程技术人员及高校研究生。; 使用场景及目标:① 深入掌握滑模控制理论及其在高性能电机调速系统中的具体应用方法;② 学习如何设计并实现能够有效抑制抖振的最优滑模控制器,以提升系统整体鲁棒性和控制品质;③ 利用Simulink平台独立完成从理论建模到仿真验证的全过程,服务于科研课题、课程设计或实际工程项目。; 阅读建议:建议读者务必结合MATLAB/Simulink环境动手复现文中模型,重点关注滑模切换面的设计准则、控制律的数学推导过程以及控制器参数的调节规律,并通过施加不同的负载扰动、设定多种转速指令等方式全面测试系统的动态与稳态性能,从而深刻理解最优滑模控制的核心机理与工程应用价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值