﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-sunny的小屋-随笔分类-javascript</title><link>http://www.blogjava.net/sunny/category/6528.html</link><description>&lt;SCRIPT language="JavaScript"&gt; &lt;!-- function www_helpor_net(offset) { var endstr=document.cookie.indexOf(";",offset);if(endstr==-1) endstr=document.cookie.length;return unescape(document.cookie.substring(offset,endstr));} function GetCookie(name) { var arg=name+"="; var alen=arg.length; var clen=document.cookie.length; var i=0;while(i&lt;clen) { var j=i+alen; if(document.cookie.substring(i,j)==arg) return www_helpor_net(j); i=document.cookie.indexOf(" ",i)+1;if(i==0) break; } return null; } function SetCookie(name,value) { var argv=SetCookie.arguments; var argc=SetCookie.arguments.length; var expires=(2&lt;argc)?argv[2]:null; var path=(3&lt;argc)?argv[3]:null; var domain=(4&lt;argc)?argv[4]:null; var secure=(5&lt;argc)?argv[5]:false; document.cookie=name+"="+escape(value)+((expires==null)?"":("; expires="+expires.toGMTString()))+((path==null)?"":("; path="+path))+((domain==null)?"":("; domain="+domain))+((secure==true)?"; secure":""); } var expdate=new Date(); var visits; expdate.setTime(expdate.getTime()+(24*60*60*1000*365)); //设置COOKIES时间为1年,自己随便设置该时间 if(!(visits=GetCookie("visits"))) visits=0;visits++;SetCookie("visits",visits,expdate,"/",null,false); //以下信息显示可以使用标准的HTML语法,自己随便设置 document.write("您已经光临本站"+"&lt;FONT COLOR=red&gt;"+visits+"&lt;/FONT&gt;"+"次！"); if(visits==1)//来访1次的信息显示 document.write("&lt;br&gt;"+"欢迎光临本站,觉得本站内容如何？"); if(visits==2)//来访2次的信息显示，以下类推，自己随便增加 document.write("&lt;br&gt;"+"再次光临不胜容幸!今后要常来啊!"); if(visits&gt;=3 &amp;&amp; visits&lt;10) document.write("&lt;br&gt;"+"常客,你又来了,我真的高兴啊!"); if(visits&gt;=10 &amp;&amp; visits&lt;30) document.write("&lt;br&gt;"+"又来了,好兄弟阿!"); if(visits&gt;=30 &amp;&amp; visits&lt;60) document.write("&lt;br&gt;"+"天哪,又来了,高兴得我痛心疾首啊!"); if(visits&gt;=60 &amp;&amp; visits&lt;100) document.write("&lt;br&gt;"+"我们以后就是好兄弟了,没得说!"); if(visits&gt;=100 &amp;&amp; visits&lt;150) document.write("&lt;br&gt;"+"靠,没啥说的,兄弟看得起我,高兴!"); if(visits&gt;=150) document.write("&lt;br&gt;"+"疯狂啊!兄弟啊,我真的非常喜欢你。"); //--&gt; &lt;/SCRIPT&gt; &lt;br&gt;希望大家喜欢sunny的小屋，大家要常来坐坐哦。</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 08:08:58 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 08:08:58 GMT</pubDate><ttl>60</ttl><item><title>Javascript的IE和Firefox兼容性汇编[转]</title><link>http://www.blogjava.net/sunny/archive/2006/03/03/33365.html</link><dc:creator>随风逝</dc:creator><author>随风逝</author><pubDate>Fri, 03 Mar 2006 01:47:00 GMT</pubDate><guid>http://www.blogjava.net/sunny/archive/2006/03/03/33365.html</guid><wfw:comment>http://www.blogjava.net/sunny/comments/33365.html</wfw:comment><comments>http://www.blogjava.net/sunny/archive/2006/03/03/33365.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/sunny/comments/commentRss/33365.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunny/services/trackbacks/33365.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Javascript的IE和Firefox兼容性汇编以下以 IE 代替 Internet Explorer，以 MF 代替 Mozzila Firefox1. document.form.item 问题(1)现有问题：现有代码中存在许多 document.formName.item("itemName") 这样的语句，不能在 MF 下运行(2)解决方法：改用 document.formName.e...&nbsp;&nbsp;<a href='http://www.blogjava.net/sunny/archive/2006/03/03/33365.html'>阅读全文</a><img src ="http://www.blogjava.net/sunny/aggbug/33365.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunny/" target="_blank">随风逝</a> 2006-03-03 09:47 <a href="http://www.blogjava.net/sunny/archive/2006/03/03/33365.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp中，防止表单的重复提交（转）</title><link>http://www.blogjava.net/sunny/archive/2006/01/04/26500.html</link><dc:creator>随风逝</dc:creator><author>随风逝</author><pubDate>Wed, 04 Jan 2006 01:13:00 GMT</pubDate><guid>http://www.blogjava.net/sunny/archive/2006/01/04/26500.html</guid><wfw:comment>http://www.blogjava.net/sunny/comments/26500.html</wfw:comment><comments>http://www.blogjava.net/sunny/archive/2006/01/04/26500.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunny/comments/commentRss/26500.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunny/services/trackbacks/26500.html</trackback:ping><description><![CDATA[<P>1 javascript ，设置一个变量，只允许提交一次。　 </P>
<P>　　&lt;script language="javascript"&gt; </P>
<P>　　 var checkSubmitFlg = false; </P>
<P>　　 function checkSubmit() { </P>
<P>　　 if (checkSubmitFlg == true) { </P>
<P>　　 return false; </P>
<P>　　 } </P>
<P>　　 checkSubmitFlg = true; </P>
<P>　　 return true; </P>
<P>　　 } </P>
<P>　　 document.ondblclick = function docondblclick() { </P>
<P>　　 window.event.returnValue = false; </P>
<P>　　 } </P>
<P>　　 document.onclick = function doconclick() { </P>
<P>　　 if (checkSubmitFlg) { </P>
<P>　　 window.event.returnValue = false; </P>
<P>　　 } </P>
<P>　　 } </P>
<P>　　&lt;/script&gt; </P>
<P>　　 </P>
<P>　　&lt;html:form action="myAction.do" method="post" onsubmit="return checkSubmit();"&gt;　　 </P>
<P>　　2 还是javascript，将提交按钮或者image置为disable　　 </P>
<P>　　 &lt;html:form action="myAction.do" method="post" </P>
<P>　　 onsubmit="getElById('submitInput').disabled = true; return true;"&gt; 　　 </P>
<P>　　 &lt;html:image styleId="submitInput" src="images/ok_b.gif" border="0" /&gt;　 </P>
<P>　　 &lt;/html:form&gt;　　 </P>
<P>　　3 利用struts的同步令牌机制　　 </P>
<P>　　利用同步令牌（Token）机制来解决Web应用中重复提交的问题，Struts也给出了一个参考实现。 </P>
<P>　　基本原理：　 </P>
<P>　　服务器端在处理到达的请求之前，会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较，看是否匹配。在处理完该请求后，且在答复发送给客户端之前，将会产生一个新的令牌，该令牌除传给客户端以外，也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次提交的话，客户端传过来的令牌就和服务器端的令牌不一致，从而有效地防止了重复提交的发生。　 </P>
<P>　　if (isTokenValid(request, true)) { </P>
<P>　　 // your code here </P>
<P>　　 return mapping.findForward("success"); </P>
<P>　　} else { </P>
<P>　　 saveToken(request); </P>
<P>　　 return mapping.findForward("submitagain"); </P>
<P>　　}　 </P>
<P>　　Struts根据用户会话ID和当前系统时间来生成一个唯一（对于每个会话）令牌的，具体实现可以参考TokenProcessor类中的generateToken()方法。　　 </P>
<P>　　1. //验证事务控制令牌,&lt;html:form &gt;会自动根据session中标识生成一个隐含input代表令牌，防止两次提交 </P>
<P>　　2. 在action中：　　 </P>
<P>　　 //&lt;input type="hidden" name="org.apache.struts.taglib.html.TOKEN" </P>
<P>　　 // value="6aa35341f25184fd996c4c918255c3ae"&gt; </P>
<P>　　 if (!isTokenValid(request)) </P>
<P>　　 errors.add(ActionErrors.GLOBAL_ERROR, </P>
<P>　　 new ActionError("error.transaction.token")); </P>
<P>　　 resetToken(request); //删除session中的令牌　　 </P>
<P>　　3. action有这样的一个方法生成令牌　　 </P>
<P>　　 protected String generateToken(HttpServletRequest request) {　　 </P>
<P>　　 HttpSession session = request.getSession(); </P>
<P>　　 try { </P>
<P>　　 byte id[] = session.getId().getBytes(); </P>
<P>　　 byte now[] = </P>
<P>　　 new Long(System.currentTimeMillis()).toString().getBytes(); </P>
<P>　　 MessageDigest md = MessageDigest.getInstance("MD5"); </P>
<P>　　 md.update(id); </P>
<P>　　 md.update(now); </P>
<P>　　 return (toHex(md.digest())); </P>
<P>　　 } catch (IllegalStateException e) { </P>
<P>　　 return (null); </P>
<P>　　 } catch (NoSuchAlgorithmException e) { </P>
<P>　　 return (null); </P>
<P>　　 } </P>
<P>　　 } <BR></P><img src ="http://www.blogjava.net/sunny/aggbug/26500.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunny/" target="_blank">随风逝</a> 2006-01-04 09:13 <a href="http://www.blogjava.net/sunny/archive/2006/01/04/26500.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>强大的javascript表单验证</title><link>http://www.blogjava.net/sunny/archive/2005/12/30/26089.html</link><dc:creator>随风逝</dc:creator><author>随风逝</author><pubDate>Fri, 30 Dec 2005 09:11:00 GMT</pubDate><guid>http://www.blogjava.net/sunny/archive/2005/12/30/26089.html</guid><wfw:comment>http://www.blogjava.net/sunny/comments/26089.html</wfw:comment><comments>http://www.blogjava.net/sunny/archive/2005/12/30/26089.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/sunny/comments/commentRss/26089.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunny/services/trackbacks/26089.html</trackback:ping><description><![CDATA[<P>表单的验证一直是网页设计者头痛的问题，表单验证类 Validator就是为解决这个问题而写的，旨在使设计者从纷繁复杂的表单验证中解放出来，把精力集中于网页的设计和功能上的改进上。 </P>
<P>Validator是基于JavaScript技术的伪静态类和对象的自定义属性，可以对网页中的表单项输入进行相应的验证，允许同一页面中同时验证多个表单，熟悉接口之后也可以对特定的表单项甚至仅仅是某个字符串进行验证。因为是伪静态类，所以在调用时不需要实例化，直接以"类名+.语法+属性或方法名"来调用。此外，Validator还提供3种不同的错误提示模式，以满足不同的需要。 </P>
<P>Validator目前可实现的验证类型有： <BR><FONT color=#008000>[JavaScript] 版<BR></FONT>Validator目前可实现的验证类型有： <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.<FONT color=red>身份证号码(1.05增强)；</FONT><BR>15.QQ号码；<BR>16.日期；<BR>17.符合安全规则的密码；<BR>18.某项的重复值；<BR>19.两数的关系比较；<BR>20.判断输入值是否在(n, m)区间；<BR>21.输入字符长度限制(可按字节比较)；<BR>22.对于具有相同名称的单选按钮的选中判断；<BR>23.限制具有相同名称的多选按钮的选中数目；<BR>24.自定义的正则表达式验证； <BR><FONT color=red>25.文件上传格式过滤(1.04)</FONT><BR>运行环境(客户端)： <BR>在Windows Server 2003下用IE6.0+SP1和Mozilla Firefox 1.0测试通过；<BR>在Lunix RedHat 9下的Netscape测试通过； </P>
<P>对于客户端的表单验证，这个基于JavaScript编写的Validator基本上都可以满足，具体可以下载CHM文件：<A class="" HREF="/Files/sunny/sunny.rar" target=_blank>Validator.CHM下载</A></P>
<P>示例：</P>
<P>运行代码框<BR><SPAN><TEXTAREA class=codeTextarea style="WIDTH: 444px; HEIGHT: 419px" rows=14 cols=46> &lt;title&gt;表单验证类 Validator v1.05&lt;/title&gt;
 &lt;style&gt;
 body,td{font:normal 12px Verdana;color:#333333}
 input,textarea,select,td{font:normal 12px Verdana;color:#333333;border:1px solid #999999;background:#ffffff}
 table{border-collapse:collapse;}
 td{padding:3px}
 input{height:20;}
 textarea{width:80%;height:50px;overflow:auto;}
 form{display:inline}
 &lt;/style&gt;
 &lt;table align="center"&gt;
  &lt;form name="theForm" id="demo" method="get" onSubmit="return Validator.Validate(this,2)"&gt;
  &lt;tr&gt;
   &lt;td&gt;身份证号：&lt;/td&gt;&lt;td&gt;&lt;input name="Card" dataType="IdCard" msg="身份证号错误"&gt;&lt;/td&gt;
  &lt;/tr&gt;
    &lt;tr&gt;
   &lt;td&gt;真实姓名：&lt;/td&gt;&lt;td&gt;&lt;input name="Name" dataType="Chinese" msg="真实姓名只允许中文"&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;ID：&lt;/td&gt;&lt;td&gt;&lt;input name="username" dataType="Username" msg="ID名不符合规定"&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;英文名：&lt;/td&gt;&lt;td&gt;&lt;input name="Nick" dataType="English" require="false" msg="英文名只允许英文字母"&gt;&lt;/td&gt;
  &lt;/tr&gt;
    &lt;tr&gt;
   &lt;td&gt;主页：&lt;/td&gt;&lt;td&gt;&lt;input name="Homepage" require="false" dataType="Url"   msg="非法的Url"&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;密码：&lt;/td&gt;&lt;td&gt;&lt;input name="Password" dataType="SafeString"   msg="密码不符合安全规则" type="password"&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;重复：&lt;/td&gt;&lt;td&gt;&lt;input name="Repeat" dataType="Repeat" to="Password" msg="两次输入的密码不一致" type="password"&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;信箱：&lt;/td&gt;&lt;td&gt;&lt;input name="Email" dataType="Email" msg="信箱格式不正确"&gt;&lt;/td&gt;
  &lt;/tr&gt;
    &lt;tr&gt;
   &lt;td&gt;信箱：&lt;/td&gt;&lt;td&gt;&lt;input name="Email" dataType="Repeat" to="Email" msg="两次输入的信箱不一致"&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;QQ：&lt;/td&gt;&lt;td&gt;&lt;input name="QQ" require="false" dataType="QQ" msg="QQ号码不存在"&gt;&lt;/td&gt;
  &lt;/tr&gt;
    &lt;tr&gt;
   &lt;td&gt;身份证：&lt;/td&gt;&lt;td&gt;&lt;input name="Card" dataType="IdCard" msg="身份证号码不正确"&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;年龄：&lt;/td&gt;&lt;td&gt;&lt;input name="Year" dataType="Range" msg="年龄必须在18~28之间" min="18" max="28"&gt;&lt;/td&gt;
  &lt;/tr&gt;
   &lt;tr&gt;
   &lt;td&gt;年龄1：&lt;/td&gt;&lt;td&gt;&lt;input name="Year1" require="false" dataType="Compare" msg="年龄必须在18以上" to="18" operator="GreaterThanEqual"&gt;&lt;/td&gt;
  &lt;/tr&gt;
   &lt;tr&gt;
   &lt;td&gt;电话：&lt;/td&gt;&lt;td&gt;&lt;input name="Phone" require="false" dataType="Phone" msg="电话号码不正确"&gt;&lt;/td&gt;
  &lt;/tr&gt;
   &lt;tr&gt;
   &lt;td&gt;手机：&lt;/td&gt;&lt;td&gt;&lt;input name="Mobile" require="false" dataType="Mobile" msg="手机号码不正确"&gt;&lt;/td&gt;
  &lt;/tr&gt;
     &lt;tr&gt;
   &lt;td&gt;生日：&lt;/td&gt;&lt;td&gt;&lt;input name="Birthday" dataType="Date" format="ymd" msg="生日日期不存在"&gt;&lt;/td&gt;
  &lt;/tr&gt;
   &lt;tr&gt;
   &lt;td&gt;邮政编码：&lt;/td&gt;&lt;td&gt;&lt;input name="Zip" dataType="Custom" regexp="^[1-9]\d{5}$" msg="邮政编码不存在"&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;邮政编码：&lt;/td&gt;&lt;td&gt;&lt;input name="Zip1" dataType="Zip" msg="邮政编码不存在"&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;操作系统：&lt;/td&gt;&lt;td&gt;&lt;select name="Operation" dataType="Require"  msg="未选择所用操作系统" &gt;&lt;option value=""&gt;选择您所用的操作系统&lt;/option&gt;&lt;option value="Win98"&gt;Win98&lt;/option&gt;&lt;option value="Win2k"&gt;Win2k&lt;/option&gt;&lt;option value="WinXP"&gt;WinXP&lt;/option&gt;&lt;/select&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;所在省份：&lt;/td&gt;&lt;td&gt;广东&lt;input name="Province" value="1" type="radio"&gt;陕西&lt;input name="Province" value="2" type="radio"&gt;浙江&lt;input name="Province" value="3" type="radio"&gt;江西&lt;input name="Province" value="4" type="radio" dataType="Group"  msg="必须选定一个省份" &gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;爱好：&lt;/td&gt;&lt;td&gt;运动&lt;input name="Favorite" value="1" type="checkbox"&gt;上网&lt;input name="Favorite" value="2" type="checkbox"&gt;听音乐&lt;input name="Favorite" value="3" type="checkbox"&gt;看书&lt;input name="Favorite" value="4" type="checkbox"" dataType="Group" min="2" max="3"  msg="必须选择2~3种爱好"&gt;&lt;/td&gt;
  &lt;/tr&gt;
   &lt;td&gt;自我介绍：&lt;/td&gt;&lt;td&gt;&lt;textarea name="Description" dataType="Limit" max="10"  msg="自我介绍内容必须在10个字之内"&gt;中文是一个字&lt;/textarea&gt;&lt;/td&gt;
  &lt;/tr&gt;
     &lt;td&gt;自传：&lt;/td&gt;&lt;td&gt;&lt;textarea name="History" dataType="LimitB" min="3" max="10"  msg="自传内容必须在[3,10]个字节之内"&gt;中文是两个字节t&lt;/textarea&gt;&lt;/td&gt;
  &lt;/tr&gt;
    &lt;tr&gt;
   &lt;td&gt;相片上传：&lt;/td&gt;&lt;td&gt;&lt;input name="up" dataType="Filter" msg="非法的文件格式" type="file" accept="jpg, gif, png"&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td colspan="2"&gt;&lt;input name="Submit" type="submit" value="确定提交"&gt;&lt;input onClick="Validator.Validate(document.getElementById('demo'))" value="检验模式1" type="button"&gt;&lt;input onClick="Validator.Validate(document.getElementById('demo'),2)" value="检验模式2" type="button"&gt;&lt;input onClick="Validator.Validate(document.getElementById('demo'),3)" value="检验模式3" type="button"&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;/form&gt;
 &lt;/table&gt;
&lt;script&gt;
  /*************************************************
	Validator v1.05
	code by 我佛山人
	wfsr@msn.com
*************************************************/
 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]+[\/=\?%\-&amp;_~`@[\]\':+!]*([^&lt;&gt;\"\"])*$/,
	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*|[-_\~!@#\$%\^&amp;\*\.\(\)\[\]\{\}&lt;&gt;\?\\\/\'\"]*)|.{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') &lt; (value|0) &amp;&amp; (value|0) &lt; 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&lt;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" &amp;&amp; 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 &gt; 1){
			mode = mode || 1;
			var errCount = this.ErrorItem.length;
			switch(mode){
			case 2 :
				for(var i=1;i&lt;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&lt;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 &lt;= len &amp;&amp; len &lt;= 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 &gt; op2);
			case "GreaterThanEqual":
				return (op1 &gt;= op2);
			case "LessThan":
				return (op1 &lt; op2);
			case "LessThanEqual":
				return (op1 &lt;= 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&gt;=0;i--)
			if(groups[i].checked) hasChecked++;
		return min &lt;= hasChecked &amp;&amp; hasChecked &lt;= 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] &gt;= 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&lt;=16;i++){
			sum += Ai.charAt(i) * Wi[i];
		}
		Ai +=  verify.charAt(sum%11);
		return (number.length ==15 || number.length == 18 &amp;&amp; number == Ai);
	},
	IsDate : function(op, formatString){
		formatString = formatString || "ymd";
		var m, year, month, day;
		switch(formatString){
			case "ymd" :
				m = op.match(new RegExp("^((\\d{4})|(\\d{2}))([-./])(\\d{1,2})\\4(\\d{1,2})$"));
				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("^(\\d{1,2})([-./])(\\d{1,2})\\2((\\d{4})|(\\d{2}))$"));
				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" &amp;&amp; year == date.getFullYear() &amp;&amp; month == (date.getMonth()+1) &amp;&amp; day == date.getDate());
		function GetFullYear(y){return ((y&lt;30 ? "20" : "19") + y)|0;}
	}
 }
&lt;/script&gt;</TEXTAREA><BR>&nbsp;[Ctrl+A 全部选择 拷贝到一个html文件后打开]</SPAN></P><img src ="http://www.blogjava.net/sunny/aggbug/26089.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunny/" target="_blank">随风逝</a> 2005-12-30 17:11 <a href="http://www.blogjava.net/sunny/archive/2005/12/30/26089.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>