always there for you

善于生活,善于学习,这是我和你的目标.

« 求职:如何应对无答案面试题?网站生成静态页面攻略 »

表单验证程序-080405版

     上午6点42,我又来到了深圳,头晕晕的,睡不着觉,突然觉醒,以后不买硬座,太累人!.

     想到今天还没有更新我的Blog,所以就上来看看了,决定把以前的表单验证修改下!

     先上网看了下几个门户网站的表单验证是怎么做的.

     先来到了腾迅的免费QQ申请页面,感觉跟我的差不多,没有仔细看它的代码.

     腾迅网页的代码都编辑了下,没有段落,缩进,真是的,小气!给人看看学习下也没什么.不看你的了.

      由于表单验证代码的自身缺陷,(好象只有IE支持自定义属性),所以我特地下了当前主流的浏览器来测试下以前的代码.

     发现以前的代码在firefox里是运行不了的,在IE6.0和Maxthon 1.6.3里能过运行!.

     在firefox 里报错,*** is not a function..

      晕.调试了好久..上网找了篇 "Javascript的IE和Firefox兼容性问题集合" 彻底崩溃,太多的不同了,决定重写这个代码,以便融合各种浏览器.

     等待...

      --08年04月07号

       还以为今天是8号呢,桌上的昨天电脑报上的日期是07号,晕死我了.

      经过今天早上的修改,现在一个兼容IE,FF,遨游的表单验证程序已经横空出世了!

     测试页面:  www.alwaysthere.com.cn/test/javascript/form.html

         源代码:
       form.html

 <html>
 <head>
 <style type="text/css">
  .errShow{display:block:font-size:12px;}
  ul{list-style:none}
  li{line-height:30px}
 </style>
 <script src="test2.js" type="text/javascript"></script>
  <title></title>
  
 </head>
 <body>

  <form id="Grade">
  <ul>
    <li>帐号:  <input errMsg="请填写正确格式的帐号" patrn="^\d{8}$" msg="帐号名不能为空"/> </li>
   <li>密码:  <input errMsg="请填写正确格式的帐号" patrn="^\d{10,}" msg="密码不能为空" type="password"/></li>
   <li><input type="submit" value="提交"/></li>
  </ul>
   </form>
 <script language="javascript">
  validFrm("Grade",30);
 </script>
 </body>
</html> 

    form.js

//表单验证程序
  //always_there
  //2008-04-07
  //获取触发事件源的坐标
   function getAbsolutePos(e1)
   {
    var _p={x:0,y:0};
    do
   {
     _p.x+=e1.offsetLeft;
     _p.y+=e1.offsetTop;
   }while(e1=e1.offsetParent)
    return _p;
  }

  //表单验证程序
  function validFrm(frmId,distance)
  {
    //初始化
    this.distance=distance;
    this.frm=document.forms[frmId];
    //表单提交验证
    this.frm.onsubmit=function()   {
     for(var j=0;this.elements[j];j++)
     {
      if(this.elements[j].validating==false)
      return false;
     }
     return true;
    };

   for(var i=0;this.frm.elements[i];i++)
    {
     //如果需要验证
     if(this.frm.elements[i].getAttribute("msg"))
     {
      //创建提示区域
      this.frm.elements[i].tip=new odiv(this.frm.elements[i],this.distance);
      this.frm.elements[i].validating=false;
      //注册事件
      this.frm.elements[i].onfocus=function()
      {
       this.tip.div.hide();
      }
      this.frm.elements[i].onblur=function()
      {
       if(this.value=="") //-表单控件为空时
       {
        this.validating=false;
        this.tip.div.show(this.getAttribute("msg"));
        return;
       }
        var re=new RegExp(this.getAttribute("patrn"));
     
       if(!re.test(this.value))
        {
         this.validating=false;
         this.tip.div.show(this.getAttribute("errMsg"));
        }
       else
        {
         this.validating=true;
         this.tip.div.rgt();
        }
      };
      }
    }
   }
  //创建提示信息对象
  function odiv(obj,distance)
   {
    this.div=document.createElement("div")
    this.div.className="errShow";
    this.div.style.position="absolute";
    this.div.style.left=getAbsolutePos(obj).x+obj.offsetWidth+distance+"px";
    this.div.style.top=getAbsolutePos(obj).y+"px";
    document.body.appendChild(this.div);
    this.div.show=function(msg)
    {
     this.innerHTML="<img src='prohibiton.gif' alt='发生错误!' width='16' height='16' />  "+msg;  
     this.style.display="";                                
   };
    this.div.hide=function()
    {
     this.style.display="none";
    };
    this.div.rgt=function()
    {
     this.innerHTML="<img src='success.gif' alt='验证通过'/>  恭喜您,已经通过验证!";
     this.style.display="";
    };
  }
 

     解决问题时获得的知识:

      1. document.formobject.elements  下只能遍历input标签

       2.all在FF里只能用于 document.all  访问所有的html标签

        3.FF里正则表达式的test使用不要开全局global,测试页面(转载):

            www.alwaysthere.com.cn/test/javascript/regFF.html

      

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

日历

最新评论及回复

最近发表

Copyright www.alwaysthere.com.cn . Some Rights Reserved.

              

Powered By Z-Blog 1.8 Devo Build 80201