找回密码
 入学

QQ登录

只需一步,快速开始

查看: 939|回复: 0

超级强大的表单验证

[复制链接]
发表于 2008-11-18 14:39:34 | 显示全部楼层 |阅读模式
  1. <title>表单验证类 Validator v1.01</title>
  2. <style>
  3. body,td{font:normal 12px Verdana;color:#333333}
  4. input,textarea,select,td{font:normal 12px Verdana;color:#333333;border:1px solid #999999;background:#ffffff}
  5. table{border-collapse:collapse;}
  6. td{padding:3px}
  7. input{height:20;}
  8. textarea{width:80%;height:50px;overfmin:auto;}
  9. form{display:inline}
  10. </style>
  11. <table align="center">
  12.   <form name="theForm" id="demo" action="" method="get" onSubmit="return Validator.Validate(this,2)">
  13.     <tr>
  14.    <td>真实姓名:</td><td><input name="Name" dataType="Chinese" msg="真实姓名只允许中文"></td>
  15.   </tr>
  16.   <tr>
  17.    <td>英文名:</td><td><input name="Nick" dataType="English" require="false" msg="英文名只允许英文字母"></td>
  18.   </tr>
  19.     <tr>
  20.    <td>主页:</td><td><input name="Homepage" require="false" dataType="Url"   msg="非法的Url"></td>
  21.   </tr>
  22.   <tr>
  23.    <td>密码:</td><td><input name="Password" dataType="SafeString"   msg="密码不符合安全规则" type="password"></td>
  24.   </tr>
  25.   <tr>
  26.    <td>重复:</td><td><input name="Repeat" dataType="Repeat" to="Password" msg="两次输入的密码不一致" type="password"></td>
  27.   </tr>
  28.   <tr>
  29.    <td>信箱:</td><td><input name="Email" dataType="Email" msg="信箱格式不正确"></td>
  30.   </tr>
  31.     <tr>
  32.    <td>信箱:</td><td><input name="Email" dataType="Repeat" to="Email" msg="两次输入的信箱不一致"></td>
  33.   </tr>
  34.   <tr>
  35.    <td>QQ:</td><td><input name="QQ" require="false" dataType="QQ" msg="QQ号码不存在"></td>
  36.   </tr>
  37.     <tr>
  38.    <td>身份证:</td><td><input name="Card" dataType="IdCard" msg="身份证号码不正确"></td>
  39.   </tr>
  40.   <tr>
  41.    <td>年龄:</td><td><input name="Year" dataType="Range" msg="年龄必须在18~28之间" min="18" max="28"></td>
  42.   </tr>
  43.    <tr>
  44.    <td>年龄1:</td><td><input name="Year1" require="false" dataType="Compare" msg="年龄必须在18以上" to="18" operator="GreaterThanEqual"></td>
  45.   </tr>
  46.    <tr>
  47.    <td>电话:</td><td><input name="Phone" require="false" dataType="Phone" msg="电话号码不正确"></td>
  48.   </tr>
  49.    <tr>
  50.    <td>手机:</td><td><input name="Mobile" require="false" dataType="Mobile" msg="手机号码不正确"></td>
  51.   </tr>
  52.      <tr>
  53.    <td>生日:</td><td><input name="Birthday" dataType="Date" format="ymd" msg="生日日期不存在"></td>
  54.   </tr>
  55.    <tr>
  56.    <td>邮政编码:</td><td><input name="Zip" dataType="Custom" regexp="^[1-9]\d{5}$" msg="邮政编码不存在"></td>
  57.   </tr>
  58.   <tr>
  59.    <td>邮政编码:</td><td><input name="Zip1" dataType="Zip" msg="邮政编码不存在"></td>
  60.   </tr>
  61.   <tr>
  62.    <td>操作系统:</td><td><select name="Operation" dataType="Require"  msg="未选择所用操作系统" ><option value="">选择您所用的操作系统</option><option value="Win98">Win98</option><option value="Win2k">Win2k</option><option value="WinXP">WinXP</option></select></td>
  63.   </tr>
  64.   <tr>
  65.    <td>所在省份:</td><td>广东<input name="Province" value="1" type="radio">陕西<input name="Province" value="2" type="radio">浙江<input name="Province" value="3" type="radio">江西<input name="Province" value="4" type="radio" dataType="Group"  msg="必须选定一个省份" ></td>
  66.   </tr>
  67.   <tr>
  68.    <td>爱好:</td><td>运动<input name="Favorite" value="1" type="checkbox">上网<input name="Favorite" value="2" type="checkbox">听音乐<input name="Favorite" value="3" type="checkbox">看书<input name="Favorite" value="4" type="checkbox"" dataType="Group" min="2" max="3"  msg="必须选择2~3种爱好"></td>
  69.   </tr>
  70.    <td>自我介绍:</td><td><textarea name="Description" dataType="Limit" max="10"  msg="自我介绍内容必须在10个字之内">中文是一个字</textarea></td>
  71.   </tr>
  72.      <td>自传:</td><td><textarea name="History" dataType="LimitB" min="3" max="10"  msg="自传内容必须在[3,10]个字节之内">中文是两个字节t</textarea></td>
  73.   </tr>
  74.   <tr>
  75.    <td colspan="2"><input name="Submit" type="submit" value="确定提交"><input onClick="Validator.Validate(document.getElementById('demo'))" value="检验模式1" type="button"><input onClick="Validator.Validate(document.getElementById('demo'),2)" value="检验模式2" type="button"><input onClick="Validator.Validate(document.getElementById('demo'),3)" value="检验模式3" type="button"></td>
  76.   </tr>
  77.   </form>
  78. </table>
  79. <script>
  80. /*************************************************
  81.         Validator v1.01
  82.         code by 我佛山人
  83.         wfsr@cunite.com
  84.         http://www.cunite.com
  85. *************************************************/
  86. Validator = {
  87.         Require : /.+/,
  88.         Email : /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
  89.         Phone : /^((\(\d{3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}$/,
  90.         Mobile : /^((\(\d{3}\))|(\d{3}\-))?13\d{9}$/,
  91.         Url : /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>""])*$/,
  92.         IdCard : /^\d{15}(\d{2}[A-Za-z0-9])?$/,
  93.         Currency : /^\d+(\.\d+)?$/,
  94.         Number : /^\d+$/,
  95.         Zip : /^[1-9]\d{5}$/,
  96.         QQ : /^[1-9]\d{4,8}$/,
  97.         Integer : /^[-\+]?\d+$/,
  98.         Double : /^[-\+]?\d+(\.\d+)?$/,
  99.         English : /^[A-Za-z]+$/,
  100.         Chinese :  /^[\u0391-\uFFE5]+$/,
  101.         UnSafe : /^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'"]*)|.{0,5})$|\s/,
  102.         IsSafe : function(str){return !this.UnSafe.test(str);},
  103.         SafeString : "this.IsSafe(value)",
  104.         Limit : "this.limit(value.length,getAttribute('min'),  getAttribute('max'))",
  105.         LimitB : "this.limit(this.LenB(value), getAttribute('min'), getAttribute('max'))",
  106.         Date : "this.IsDate(value, getAttribute('min'), getAttribute('format'))",
  107.         Repeat : "value == document.getElementsByName(getAttribute('to'))[0].value",
  108.         Range : "getAttribute('min') < value && value < getAttribute('max')",
  109.         Compare : "this.compare(value,getAttribute('operator'),getAttribute('to'))",
  110.         Custom : "this.Exec(value, getAttribute('regexp'))",
  111.         Group : "this.MustChecked(getAttribute('name'), getAttribute('min'), getAttribute('max'))",
  112.         ErrorItem : [document.forms[0]],
  113.         ErrorMessage : ["以下原因导致提交失败:\t\t\t\t"],
  114.         Validate : function(theForm, mode){
  115.                 var obj = theForm || event.srcElement;
  116.                 var count = obj.elements.length;
  117.                 this.ErrorMessage.length = 1;
  118.                 this.ErrorItem.length = 1;
  119.                 this.ErrorItem[0] = obj;
  120.                 for(var i=0;i<count;i++){
  121.                         with(obj.elements[i]){
  122.                                 var _dataType = getAttribute("dataType");
  123.                                 if(typeof(_dataType) == "object" || typeof(this[_dataType]) == "undefined")  continue;
  124.                                 this.ClearState(obj.elements[i]);
  125.                                 if(getAttribute("require") == "false" && value == "") continue;
  126.                                 switch(_dataType){
  127.                                         case "Date" :
  128.                                         case "Repeat" :
  129.                                         case "Range" :
  130.                                         case "Compare" :
  131.                                         case "Custom" :
  132.                                         case "Group" :
  133.                                         case "Limit" :
  134.                                         case "LimitB" :
  135.                                         case "SafeString" :
  136.                                                 if(!eval(this[_dataType]))        {
  137.                                                         this.AddError(i, getAttribute("msg"));
  138.                                                 }
  139.                                                 break;
  140.                                         default :
  141.                                                 if(!this[_dataType].test(value)){
  142.                                                         this.AddError(i, getAttribute("msg"));
  143.                                                 }
  144.                                                 break;
  145.                                 }
  146.                         }
  147.                 }
  148.                 if(this.ErrorMessage.length > 1){
  149.                         mode = mode || 1;
  150.                         var errCount = this.ErrorItem.length;
  151.                         switch(mode){
  152.                         case 2 :
  153.                                 for(var i=1;i<errCount;i++)
  154.                                         this.ErrorItem[i].style.color = "red";
  155.                         case 1 :
  156.                                 alert(this.ErrorMessage.join("\n"));
  157.                                 this.ErrorItem[1].focus();
  158.                                 break;
  159.                         case 3 :
  160.                                 for(var i=1;i<errCount;i++){
  161.                                 try{
  162.                                         var span = document.createElement("SPAN");
  163.                                         span.id = "__ErrorMessagePanel";
  164.                                         span.style.color = "red";
  165.                                         this.ErrorItem[i].parentNode.appendChild(span);
  166.                                         span.innerHTML = this.ErrorMessage[i].replace(/\d+:/,"*");
  167.                                         }
  168.                                         catch(e){alert(e.description);}
  169.                                 }
  170.                                 this.ErrorItem[1].focus();
  171.                                 break;
  172.                         default :
  173.                                 alert(this.ErrorMessage.join("\n"));
  174.                                 break;
  175.                         }
  176.                         return false;
  177.                 }
  178.                 return true;
  179.         },
  180.         limit : function(len,min, max){
  181.                 min = min || 0;
  182.                 max = max || Number.MAX_VALUE;
  183.                 return min <= len && len <= max;
  184.         },
  185.         LenB : function(str){
  186.                 return str.replace(/[^\x00-\xff]/g,"**").length;
  187.         },
  188.         ClearState : function(elem){
  189.                 with(elem){
  190.                         if(style.color == "red")
  191.                                 style.color = "";
  192.                         var lastNode = parentNode.childNodes[parentNode.childNodes.length-1];
  193.                         if(lastNode.id == "__ErrorMessagePanel")
  194.                                 parentNode.removeChild(lastNode);
  195.                 }
  196.         },
  197.         AddError : function(index, str){
  198.                 this.ErrorItem[this.ErrorItem.length] = this.ErrorItem[0].elements[index];
  199.                 this.ErrorMessage[this.ErrorMessage.length] = this.ErrorMessage.length + ":" + str;
  200.         },
  201.         Exec : function(op, reg){
  202.                 return new RegExp(reg,"g").test(op);
  203.         },
  204.         compare : function(op1,operator,op2){
  205.                 switch (operator) {
  206.                         case "NotEqual":
  207.                                 return (op1 != op2);
  208.                         case "GreaterThan":
  209.                                 return (op1 > op2);
  210.                         case "GreaterThanEqual":
  211.                                 return (op1 >= op2);
  212.                         case "LessThan":
  213.                                 return (op1 < op2);
  214.                         case "LessThanEqual":
  215.                                 return (op1 <= op2);
  216.                         default:
  217.                                 return (op1 == op2);            
  218.                 }
  219.         },
  220.         MustChecked : function(name, min, max){
  221.                 var groups = document.getElementsByName(name);
  222.                 var hasChecked = 0;
  223.                 min = min || 1;
  224.                 max = max || groups.length;
  225.                 for(var i=groups.length-1;i>=0;i--)
  226.                         if(groups[i].checked) hasChecked++;
  227.                 return min <= hasChecked && hasChecked <= max;
  228.         },
  229.         IsDate : function(op, formatString){
  230.                 formatString = formatString || "ymd";
  231.                 var m, year, month, day;
  232.                 switch(formatString){
  233.                         case "ymd" :
  234.                                 m = op.match(new RegExp("^((\\d{4})|(\\d{2}))([-./])(\\d{1,2})\\4(\\d{1,2})$"));
  235.                                 if(m == null ) return false;
  236.                                 day = m[6];
  237.                                 month = m[5]--;
  238.                                 year =  (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3], 10));
  239.                                 break;
  240.                         case "dmy" :
  241.                                 m = op.match(new RegExp("^(\\d{1,2})([-./])(\\d{1,2})\\2((\\d{4})|(\\d{2}))$"));
  242.                                 if(m == null ) return false;
  243.                                 day = m[1];
  244.                                 month = m[3]--;
  245.                                 year = (m[5].length == 4) ? m[5] : GetFullYear(parseInt(m[6], 10));
  246.                                 break;
  247.                         default :
  248.                                 break;
  249.                 }
  250.                 if(!parseInt(month)) return false;
  251.                 month = month==12 ?0:month;
  252.                 var date = new Date(year, month, day);
  253.         return (typeof(date) == "object" && year == date.getFullYear() && month == date.getMonth() && day == date.getDate());
  254.                 function GetFullYear(y){return ((y<30 ? "20" : "19") + y)|0;}
  255.         }
  256. }
  257. </script>
复制代码
您需要登录后才可以回帖 登录 | 入学

本版积分规则

QQ|Archiver|手机版|小黑屋|校园天空成立于2004年2月24日 ( 陕ICP备08000078号-8 )

GMT+8, 2025-5-11 03:05 , Processed in 0.100565 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表