在表单的验证中,为了做到强验证,许多人会将验证域绑定onblur事件:
  var
   notis 
  =
   [notis0,notis1,....]  
  //
  提示信息
  
  function
   validate(patten)
  ...
  {
   if(this.value.test(patten)...{   //patten为验证正则表达式。
         this.focus();
         this.select();
         return notis[i];
   }
}
 但这种绑定有些问题,当两个以上的域同时使用这种绑定时,会造成死锁。
假设域A和域B都绑定了上述事件,当焦点从A转移到B时,触发了A的onblur事件,并试图把焦点从B转移到A,并触发了B的onblur事件,于是就......死锁啦。
解决这个问题的方案有两个:
一是把强提示改为温和提示,改为绑定onchange事件。
二是判断其他域是否已经获得焦点。
  
  var
   otherElementFocusing 
  =
   
  function
  ()
  ...
  {
   var focusing = false;
   var eles = document.getElementsByTagName("INPUT");
   for(var i=0;i<eles.length;i++)
       if(eles[i].onblurChanged)focusing = true;
   eles = document.getElementsByTagName("TEXTAREA");
   for(i=0;i<eles.length;i++)
       if(eles[i[.onblurChanged)focusing = true;
   return focusing;   
}
  
  var
   focus 
  =
   
  function
  (ele)
  ...
  {
   if(otherElementFocusing()||getVisib(ele)== "hidden")return;//getVisib:获得display和visibility
   if(!ele.onblurChanged)...{
      ele.onblurChanged = true;
      if(!ele.onblur)...{
          ele.select();
          ele.focus();
          ele.onblur = function()...{ele.select();ele.focus()}
      }else ...{
          ele.oldOnblur = ele.onblur;
          ele.onblur = ele.onblur.bindBefore(function()...{ele.select();ele.focus()});
      }
   }
}
  
  var
   unfocus 
  =
   
  function
  (ele)
  ...
  {
    if(getVisb(ele)!="hidden"&&ele.onblurChanged)...{
       if(ele.oldOnblur)ele.onblur= ele.oldOnblur;
       else ele.onblur = "";
       ele.onblurChanged = false;
    }
}
 这样可以从onblur和focus的循环中解脱出来。
方法二的使用需要注意的是,验证提示方法http://www.jspcn.net/htmlnews/B20070807102121.html不要使用alert。道理同上,alert后,点击确定也会触发验证域的onblur事件,造成验证域与alter窗口间的死锁。
                  
                  
                  
                  
本文探讨了表单验证中因onblur事件绑定不当导致的死锁问题,并提供了两种解决方案:一是采用onchange事件实现温和提示;二是通过检查其他元素是否获得焦点来避免死锁。
          
      
          
                
                
                
                
              
                
                
                
                
                
              
                
                
              
            
                  
					795
					
被折叠的  条评论
		 为什么被折叠?
		 
		 
		
    
  
    
  
            


            