html表单验证程序

 
 
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
  2. <html xmlns="http://www.w3.org/1999/xhtml"> 
  3. <head> 
  4. <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> 
  5. <title>vForm表单验证程序</title> 
  6. <style type="text/css"> 
  7. <!-- 
  8. div.info { 
  9.  width: 170px; 
  10.  overflow:visible; 
  11.  height:auto; 
  12.  font-size: small; 
  13.  position: absolute; 
  14.  background-color: #FFffdd; 
  15.  border: 1px solid #000; 
  16.  filter:progid:DXImageTransform.Microsoft.Shadow(color=#111111,direction=135,strength=3); 
  17.  top: 375px; 
  18.  padding: 5px; 
  19.  left: 671px; 
  20. div.info_title 
  21.  
  22. .err{ 
  23.  padding: 5px; 
  24.  height: 50px; 
  25.  width: 24em; 
  26.  position: absolute; 
  27.  background-color: #FFFFCC; 
  28.  left: 196px; 
  29.  top: 114px; 
  30.  font-size: small; 
  31.  opacity:0.5; 
  32.  border: 1px double #333333; 
  33.  filter: Shadow(Color=#000000, Direction=135); 
  34.  filter:progid:DXImageTransform.Microsoft.Shadow(color=#111111,direction=135,strength=5); 
  35.  
  36. #form1 .text_input { 
  37.  border-top: 1px solid #333333; 
  38.  border-right: 1px solid #999999; 
  39.  border-bottom: 1px solid #ddd; 
  40.  border-left: 1px solid #000000; 
  41. .info_title { 
  42.  color: #FF0000; 
  43.  background: #ACB9D1; 
  44. #form1 { 
  45.  position: static; 
  46.  left: 581px; 
  47.  top: 463px; 
  48.  border: 1px solid #3300FF; 
  49.  padding: 5px; 
  50.  ; 
  51. #imok { 
  52.  display: block; 
  53.  position: absolute; 
  54.  height:315px; 
  55.  overflow:scroll; 
  56.  left: 100px; 
  57.  top: 100px; 
  58.  width: 306px; 
  59. .title h1 { 
  60.  background: #33CCFF; 
  61.  border-bottom: medium solid #3366FF; 
  62. .title p { 
  63.  font-size: medium; 
  64.  text-indent: 2em; 
  65. body { 
  66.  font-family: Verdana, Arial, Helvetica, sans-serif; 
  67.  font-size: medium; 
  68.  
  69. code { 
  70.  font: 12px/18px "lucida Grande", verdana, lucida, Arial, helvetica, "宋体", sans-serif; 
  71.  border:1px solid #0099cc; 
  72.  padding:5px; 
  73.  margin: 5px; 
  74.  width: 80%; 
  75.  color: #000; 
  76.  background-color: #ddedfb; 
  77.  display: block; 
  78.  
  79. --> 
  80. </style> 
  81. <script language="JavaScript" type="text/javascript"> 
  82. //程序基本思路:通过扩展对象来实现,将String扩展 将默认的表单元素扩展 定义两个自定义对象。 
  83. //String.isEmail 
  84. //String.isUrl 
  85. //表单元素.required 
  86. //表单元素.isvalid 
  87. //表单元素.validate 
  88. // 
  89.  
  90. //字符串验证扩展 
  91. //├电子邮件验证 
  92. String.prototype.isEmail = function(){ 
  93.  var tmpStr = this
  94.  var email = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/; 
  95.  return email.test(tmpStr) 
  96. //├http地址验证 
  97. String.prototype.isUrl = function(){ 
  98.  var url = /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/; 
  99.  var tmpStr = this
  100.  return url.test(tmpStr); 
  101. //├日期验证(第一部分) 
  102. String.prototype.isDateTime = function(){ 
  103.  if(Date.parse(this)||Date.parseDate(this)) 
  104.  { 
  105.   return true; 
  106.  } 
  107.  else 
  108.  { 
  109.   return false; 
  110.  } 
  111. String.prototype.isInteger = function() 
  112.  var _i = /^[-\+]?\d+$/; 
  113.  var _s = this;  
  114.  return _i.test(_s); 
  115. Date.prototype.toIsoDate = function() 
  116.  var _d = this
  117.  var _s; 
  118.  _Y =_d.getFullYear(); 
  119.  _M = _d.getMonth() + 1; 
  120.  _D = _d.getDate(); 
  121.  _H = _d.getHours(); 
  122.  _I = _d.getMinutes(); 
  123.  _S = _d.getSeconds(); 
  124.  with(_d) 
  125.  { 
  126.   _s = [getMonth() + 1,getDate(),getHours(),getMinutes(),getSeconds()]; 
  127.  } 
  128.  for(var i = 0; i < _s.length; i++) 
  129.  { 
  130.   if (_s[i].toString().length == 1)_s[i]= '0'+_s[i]; 
  131.  } 
  132.   return (_Y + '-'+_s[0]+'-'+_s[1]+' '+_s[2]+':'+_s[3]+':'+_s[4]) 
  133. //├日期验证(第二部分) 
  134. Date.parseDate = function(str, fmt) { 
  135.  fmtfmt = fmt||"%Y-%m-%d %H:%M"; 
  136.  var today = new Date(); 
  137.  var y = 0
  138.  var m = -1; 
  139.  var d = 0
  140.  var a = str.split(/\W+/); 
  141.  var b = fmt.match(/%./g); 
  142.  var i = 0j = 0
  143.  var hr = 0
  144.  var min = 0
  145.  for (i = 0; i < a.length; ++i) { 
  146.   if (!a[i]) 
  147.    continue; 
  148.   switch (b[i]) { 
  149.       case "%d": 
  150.       case "%e": 
  151.    d = parseInt(a[i], 10); 
  152.    break; 
  153.  
  154.       case "%m": 
  155.    m = parseInt(a[i], 10) - 1; 
  156.    break; 
  157.  
  158.       case "%Y": 
  159.       case "%y": 
  160.    y = parseInt(a[i], 10); 
  161.    (y < 100) && (y += (y > 29) ? 1900 : 2000); 
  162.    break; 
  163.  
  164.       case "%b": 
  165.       case "%B": 
  166.    for (j = 0; j < 12; ++j) { 
  167.     if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { m = j; break; } 
  168.    } 
  169.    break; 
  170.  
  171.       case "%H": 
  172.       case "%I": 
  173.       case "%k": 
  174.       case "%l": 
  175.    hr = parseInt(a[i], 10); 
  176.    break; 
  177.  
  178.       case "%P": 
  179.       case "%p": 
  180.    if (/pm/i.test(a[i]) && hr < 12
  181.     hr += 12; 
  182.    else if (/am/i.test(a[i]) && hr >= 12) 
  183.     hr -12
  184.    break; 
  185.  
  186.       case "%M": 
  187.    min = parseInt(a[i], 10); 
  188.    break; 
  189.   } 
  190.  } 
  191.  if (isNaN(y)) y = today.getFullYear(); 
  192.  if (isNaN(m)) m = today.getMonth(); 
  193.  if (isNaN(d)) d = today.getDate(); 
  194.  if (isNaN(hr)) hr = today.getHours(); 
  195.  if (isNaN(min)) min = today.getMinutes(); 
  196.  if (y != 0 && m != -1 && d != 0) 
  197.   return new Date(y, m, d, hr, min, 0); 
  198.  y = 0m = -1; d = 0
  199.  for (i = 0; i < a.length; ++i) { 
  200.   if (a[i].search(/[a-zA-Z]+/) != -1) { 
  201.    var t = -1; 
  202.    for (j = 0; j < 12; ++j) { 
  203.     if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { t = j; break; } 
  204.    } 
  205.    if (t != -1) { 
  206.     if (m != -1) { 
  207.      d = m+1; 
  208.     } 
  209.     m = t
  210.    } 
  211.   } else if (parseInt(a[i], 10) <= 12 && m == -1) { 
  212.    m = a[i]-1; 
  213.   } else if (parseInt(a[i], 10) > 31 && y == 0) { 
  214.    y = parseInt(a[i], 10); 
  215.    (y < 100) && (y += (y > 29) ? 1900 : 2000); 
  216.   } else if (d == 0) { 
  217.    d = a[i]; 
  218.   } 
  219.  } 
  220.  if (y == 0) 
  221.   y = today.getFullYear(); 
  222.  if (m != -1 && d != 0) 
  223.   return new Date(y, m, d, hr, min, 0); 
  224.  return today; 
  225. }; 
  226. //扩展完成 
  227.  
  228. //对象定义 
  229.  
  230. var vform = new Object; 
  231. //获取弹出提示的显示位置 
  232. vform.getAbsolutePos = function(el) { 
  233.  var _p = { x: 0, y: 0 }; 
  234.   do{ 
  235.     _p.x += (el.offsetLeft - el.scrollLeft); 
  236.     _p.y += (el.offsetTop - el.scrollTop);  
  237.   } 
  238.    while(elel=el.offsetParent) 
  239.      return _p; 
  240.       }; 
  241. vform.toString = function() 
  242.  return("vForm表单验证程序\n版本:1.0beta\n作者:雷晓宝\n时间:2006-07-31\n网址:http://lxbzj.com\n许可:LGPL"); 
  243. vform.rules = new Array; 
  244. vform.rules.add = function(obj,minLength,dataType,errmsg,maxLength,rule,patams) 
  245.     var curlen = this.length; 
  246.         this[curlen] = [obj,minLength,dataType,errmsg,maxLength,rule,patams]; 
  247.         //this[curlen] = [ 0 ,    1    ,    2   ,   3  ,   4  ,  5 ,   6  ]; 
  248.  
  249.     return this.length; 
  250. vform.initfunction() 
  251.  if(document.getElementById(this.form_id)) 
  252.  { 
  253.   //获取表单 
  254.   var o = document.getElementById(this.form_id); 
  255.   //遍历规则 
  256.   for(var i = 0 ;i< this.rules.length;i++) 
  257.   { 
  258.    _r = this.rules[i] 
  259.    //如果存在元素,则添加验证程序 
  260.    if(_o = o.elements[_r[0]]) 
  261.    { 
  262.     //判断是是否必填,是否有最小长度 
  263.     if(_r[1] > 0 ) 
  264.     { 
  265.      _o.required = true;//必填的含义和最小长度为1是一样的 
  266.      _o.minLength = parseInt(_r[1]); 
  267.     } 
  268.     else 
  269.     { 
  270.      _o.required = false
  271.      _o.minLength = 0
  272.     } 
  273.     //判断是否有最大长度; 
  274.     if(_r[4]) 
  275.     { 
  276.      _o.maxLength = parseInt(_r[4]); 
  277.     } 
  278.     //添加长度验证函数 
  279.     _o.validLength = function () 
  280.     { 
  281.      var b =true
  282.      if(this.minLength) 
  283.      { 
  284.       b = (this.minLength <= this.value.length); 
  285.      } 
  286.      if(this.type == 'textarea' && this.maxLength ) 
  287.      { 
  288.       bb = b && (this.maxLength >= this.value.length ); 
  289.      } 
  290.      return (b); 
  291.     } 
  292.     //添加验证,进行格式验证 
  293.     switch(_r[2]) 
  294.     { 
  295.      case 'e-mail': 
  296.       _o.validate = function() 
  297.       { 
  298.        thisthis.isvalid = this.validLength() && this.value.isEmail(); 
  299.        return (this.isvalid); 
  300.       }; 
  301.       break; 
  302.      case 'url': 
  303.       _o.validate = function() 
  304.       { 
  305.        if (this.value.substring(0,7) != 'http://')this.value = 'http://' +this.value; 
  306.        thisthis.isvalid = this.validLength() && this.value.isUrl(); 
  307.        return (this.isvalid); 
  308.       } 
  309.       break; 
  310.      case 'date': 
  311.       _o.validate = function() 
  312.       { 
  313.        var _d = Date.parse(this.value)||Date.parseDate(this.value); 
  314.        this.value =  _d.toIsoDate(); 
  315.         
  316.        thisthis.isvalid = this.validLength() && this.value.isDateTime(); 
  317.        return (this.isvalid); 
  318.        aa=a>b?1:1; 
  319.       } 
  320.       break; 
  321.      case 'number': 
  322.       _o.validate = function() 
  323.       { 
  324.        thisthis.isvalid = this.validLength() && this.value.isInteger(); 
  325.        return (this.isvalid); 
  326.  
  327.       } 
  328.       break; 
  329.      case 'any': 
  330.       _o.validate = function() 
  331.       { 
  332.        thisthis.isvalid = this.validLength(); 
  333.        return  this.isvalid 
  334.       } 
  335.       break; 
  336.      default : 
  337.       var regexp = /^\\\w+$/; 
  338.       if ( regexp.test(_r[2]))//表示必须和同表单下的某个字段的值一样。用于重复输入的验证 
  339.       { 
  340.        _el = _r[2].substring(1); 
  341.        if (o.elements[_el]){ 
  342.         _o.equal = _el
  343.         _o.validate = function() 
  344.         { 
  345.          if(_o = this.form.elements[this.equal]) 
  346.          { 
  347.           if ( (_o.value == this.value) && this.validLength()) 
  348.           { 
  349.            return true; 
  350.           }else { 
  351.           return false; 
  352.           } 
  353.          }else{ 
  354.           alert('setup error'); 
  355.          } 
  356.          
  357.         } 
  358.        }else 
  359.        { 
  360.         alert(_el + 'is not a valid form element'); 
  361.         _o.validate = function(){return true;} 
  362.        } 
  363.       } 
  364.       var regexp1 = /^\\(==|!=|>=|<=|>|<)/; 
  365.       if ( regexp1.test(_r[2]) ) 
  366.       { 
  367.        _s0 = _r[2]; 
  368.        _s1 = RegExp.$1; 
  369.        _s2 = _s0.replace(regexp1,''); 
  370.        _operator = _s1.substring(0);//比较操作符 
  371.        var regexp2 = /^\w+$/; 
  372.        if (regexp2.test(_s2))//是一个标志符,整数 或者变量 
  373.        { 
  374.         _o.operation = _operator+_s2; 
  375.         _o.validate = function() 
  376.         { 
  377.          _b = true
  378.          if (this.value.length !=0) 
  379.          { 
  380.           _b = eval(this.value+this.operation+';'); 
  381.          }          
  382.          _b_b = _b && this.validLength(); 
  383.          return _b; 
  384.         } 
  385.        } 
  386.       }; 
  387.       break; 
  388.        
  389.     } 
  390.     //添加验证提示(div标签)并初始化 
  391.     var _p = vform.getAbsolutePos(_o); 
  392.     _o.tip = new tip(_r[3],vform.err_class,_p.x+_o.offsetWidth+3,_p.y); 
  393.  
  394.     _o.tip.init(); 
  395.     //失去焦点时,开始验证 
  396.     _o.onblur =function(e) 
  397.     { 
  398.      if(this.minLength || this.value.length >0)  
  399.      {  
  400.       if( this.validate() ) 
  401.       { 
  402.        this.tip.hide(); 
  403.       }else 
  404.       { 
  405.        this.tip.show();//显示错误信息 
  406.        //this.focus(); 添加这句在ie里会导致死循环 :( 
  407.        return false; 
  408.       } 
  409.      } 
  410.     } 
  411.    } 
  412.   } 
  413.  //焦点验证可能会失败,所以最后需要表单提交前的验证作为最后的补充。 
  414.   document.getElementById(this.form_id).onsubmit = function() 
  415.   { 
  416.    var valid = true
  417.    for(i=0;i<this.elements.length;i++) 
  418.    { 
  419.     _o = this.elements[i]; 
  420.     if(_o.minLength && !_o.isvalid) 
  421.     { 
  422.      _o.tip.show(); 
  423.      valid = false
  424.     } 
  425.    } 
  426.    return valid; 
  427.   } 
  428.  } 
  429. //弹出提示定义 
  430. function tip(text,className,x,y) 
  431.  var o = document.createElement("div"); 
  432.  o.style.display = "none"
  433.  o.innerHTML = text
  434.  //var t = document.createTextNode(text); 
  435.  document.body.appendChild(o); 
  436.  //o.appendChild(t); 
  437.   
  438.  this.init = function(dis) 
  439.  { 
  440.   o.className = "info"
  441.   o.style.left = x+"px"; 
  442.   o.style.top = y+"px"; 
  443.   o.style.zindex = 100
  444.   if(dis) 
  445.   { 
  446.    o.style.display = ""
  447.   } 
  448.   else 
  449.   { 
  450.    o.style.display = "none"
  451.   } 
  452.  } 
  453.  this.show = function() 
  454.  { 
  455.   o.style.display = ""
  456.  } 
  457.  this.hide = function() 
  458.  { 
  459.   o.style.display = "none"
  460.  } 
  461. function start() 
  462.   vform.form_id = 'form1';//必须是表单的id 
  463.   vform.err_class = 'info';//出错提示的样式 
  464.  //验证规则,逐条填写 
  465. vform.rules.add('frm_name',1,'e-mail','请您按照 user@domain.com 的格式输入电子邮件地址。<br /><span style="color:#f00">必填项目</span>'); 
  466.   vform.rules.add('myweb',1,'url','请您按照 http://www.domain.com 的格式输入您的网址。<br /><span style="color:#f00">必填项目</span>'); 
  467.   vform.rules.add('dateinput',0,'date','请按2000-03-05 的格式输入日期。<br /><span style="color:#f00">必填项目</span>'); 
  468.   vform.rules.add('qq',0,'number','这必须是一个整数'); 
  469.   vform.rules.add('least10',10,'any','您必须至少填写10个<br /><span style="color:#f00">必填项目</span>'); 
  470.   vform.rules.add('ok100',1,'any','这里被限制为100个字符<br /><span style="color:#f00">必填项目</span>',100); 
  471.   vform.rules.add('r_pass0',5,'any','密码最短5位最长20位<br /><span style="color:#f00">必填项目</span>',20); 
  472.   vform.rules.add('r_pass1',5,"\\r_pass0",'确认密码错误<br /><span style="color:#f00">必填项目</span>',20); 
  473.   vform.rules.add('frm_sel',1,"\\>2",'必须大于2000<br /><span style="color:#f00">必填项目</span>'); 
  474.   vform.init(); 
  475.   
  476.  
  477. </script> 
  478. </head> 
  479. <body onload="start()"> 
  480.  
  481. <form id="form1" name="form1" method="get" action=""> 
  482.  <label for="frm_name">e-mail: 
  483.  <input name="frm_name" type="text" class="text_input" id="frm_name" title="输入一个电子邮箱地址"/> 
  484.  </label> 
  485.  * 
  486.  <p> 
  487.   <label for="r_pass0">输入密码: 
  488.   <input name="r_pass0" type="text" class="text_input" id="r_pass0" title="输入您希望的密码 " /> 
  489.   </label> 
  490.  *</p> 
  491.  <p> 
  492.   <label for="r_pass1">密码确认: 
  493.   <input name="r_pass1" type="text" class="text_input" id="r_pass1" title="将密码确认一次" /> 
  494.   </label> 
  495.  *</p> 
  496.  <p> 
  497.   <label for="frm_sel">选择: 
  498.   <select name="frm_sel" id="frm_sel" title="请选择一个答案"> 
  499.    <option value="0">请选择一个答案</option> 
  500.    <option value="1" selected="selected">1000</option> 
  501.    <option value="2">2000</option> 
  502.    <option value="3">3000</option> 
  503.    <option value="4">4000</option> 
  504.    <option value="5">5000</option> 
  505.    <option value="6">6000</option> 
  506.   </select> 
  507. </label> 
  508.  *</p> 
  509.  <p> 
  510.   <label for="input3">输入网址: 
  511.   <input name="myweb" type="text" class="text_input" id="input3" title="输入一个网址" onmousemove="" value="http://" maxlength="100"/> 
  512.   </label> 
  513.  *</p> 
  514.  <p> 
  515.   <label for="dateinput">输入日期 
  516.   <input name="dateinput" type="text" class="text_input" title="输入一个日期" id="dateinput"/> 
  517. </label> 
  518.  *</p> 
  519.  <p> 
  520.   <label for="mub">输入数字 
  521.   <input name="qq" type="text" class="text_input" title="填写数字" id="mub"/> 
  522.   </label> 
  523.  </p> 
  524.  <p> 
  525.   <label for="len">输入任意但长度限制为10个 
  526.   <input name="least10" type="text" class="text_input" maxlength="88" id="len"/> 
  527.   * 
  528.   </label> 
  529.  </p> 
  530.  <p> 
  531.   <label for="text">只能输入100个 
  532.   <textarea name="ok100" cols="40" rows="5" id="text" title="详细内容"></textarea> 
  533.   * 
  534.   </label> 
  535.  </p> 
  536.  <p> 
  537.   <input type="submit" name="Submit" value="提交" /> 
  538.   <button onclick="alert(vform)" >关于验证程序</button> 
  539.  </p> 
  540. </form> 
  541. <!--具体的日期设置,必须放在body的结束标签前面--> 
  542. <script type="text/javascript"> 
  543.   vform .init(); 
  544.     Calendar.setup({ 
  545.    inputField     :    "dateinput",   // 把这个改成你需要的 id 
  546.    ifFormat       :    "%Y-%m-%d %H:%M", // format of the input field 
  547.    showsTime      :    true, 
  548.    //button     :    "dateinput_btn",  
  549.    timeFormat     :    "24" 
  550.    }); 
  551.  </script> 
  552. </body> 
  553. </html> 
  554.  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
  表单的验证一直是网页设计者头痛的问题,表单验证Validator就是为解决这个问题而写的,旨在使设计者从纷繁复杂的表单验证中解放出来,把精力集中于网页的设计和功能上的改进上。 <br><br>  Validator是基于JavaScript技术的伪静态类和对象的自定义属性,可以对网页中的表单项输入进行相应的验证,允许同一页面中同时验证多个表单,熟悉接口之后也可以对特定的表单项甚至仅仅是某个字符串进行验证。因为是伪静态类,所以在调用时不需要实例化,直接以"类名+.语法+属性或方法名"来调用。此外,Validator还提供3种不同的错误提示模式,以满足不同的需要。<br><br>  完整文档下载: Validator.chm (zip压缩,111K)<br><br>  Validator目前可实现的验证类型有:<br><br>  1.是否为空;<br>  2.中文字符;<br>  3.双字节字符<br>  4.英文;<br>  5.数字;<br>  6.整数;<br>  7.实数;<br>  8.Email地址;<br>  9.使用HTTP协议的网址;<br>  10.电话号码;<br>  11.货币;<br>  12.手机号码;<br>  13.邮政编码;<br>  14.身份证号码;<br>  15.QQ号码;<br>  16.日期;<br>  17.符合安全规则的密码;<br>  18.某项的重复值;<br>  19.两数的关系比较;<br>  20.判断输入值是否在(n, m)区间;<br>  21.输入字符长度限制(可按字节比较);<br>  22.对于具有相同名称的单选按钮的选中判断;<br>  23.限制具有相同名称的多选按钮的选中数目;<br>  24.自定义的正则表达式验证; <br><br>  运行环境(客户端): <br><br>  在Windows Server 2003下用IE6.0+SP1和Mozilla Firefox 1.0测试通过;<br>  在Lunix RedHat 9下的Netscape测试通过;<br>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值