html表单验证程序


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值