因为onblur是失去焦点之后才触发的,如果焦点刚好在另一个有同样限制的控件上就会"死循环"如果有一个事件在焦点离开之前触发的话,就可以轻松解决我的问题.

解决方案 »

  1.   

    onblur="doTest(this)"
    function doTest(obj){
      if(!ok){
        obj.focus();
      }
    }
      

  2.   

    应该在所有控件上都套用onfocus,里面写上判断,如果不行,利用tab顺序反跳
      

  3.   

    其实你只要载form中做一个触发就可以了
    比如:
    <SCRIPT language=JavaScript type="text/javascript">
    <!--
    <!-- hide this script from non-javascript-enabled browsers
      
    function chkform(){
     //check the user input value 
     if( document.form2.realname.value==""){
         alert("真实姓名不能为空");
         document.form2.realname.focus();
         return false;
      }
    var rname=/^[\u4E00-\u9FA5]{2,4}$/;
     if( !rname.test(document.form2.realname.value))  {
         alert("真实姓名只能为汉字,且最多只能是四个汉字!");
         document.form2.realname.focus();
     document.form2.realname.select();
         return false;
      }
      if( document.form2.sex.value==""){
         alert("请选择性别!");
         document.form2.sex.focus();
         return false;          
      }
      if( document.form2.cyear.value==""){
         alert("生日年份不能为空!");
         document.form2.cyear.focus(); 
         return false;          
      }
    // stop hiding -->
    //-->
    </SCRIPT>
    <form action="" method="post" name="form2" onSubmit="return chkform();" style="margin:0">
    <table width="100%" border="0" align="center" cellpadding="0" cellspacing="0">
      <tr>
        <td><table width="100%"  border="0" cellspacing="0" cellpadding="0">
    <tr>
            <td width="200" height="20" align="right"><span class="STYLE2">真实姓名:</span></td>
            <td><input name="realname" type="text" class="inp" id="realname" size="15"></td>
          </tr>
          <tr>
            <td width="200" height="20" align="right">性别:</td>
            <td><input name="sex" type="radio" value="男" checked >

      <input type="radio" name="sex" value="女" >
    女</td>
          </tr>
    </table>
    这样不就可以了?
      

  4.   

    此问题我在做验证器时也碰到过,采取了个笨办法解决的。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()});
              //bindBefor:将一个方法绑定到另一个方法之前。详见我的博客。
          }
       }
    }
    var unfocus = function(ele){
        if(getVisb(ele)!="hidden"&&ele.onblurChanged){
           if(ele.oldOnblur)ele.onblur= ele.oldOnblur;
           else ele.onblur = "";
           ele.onblurChanged = false;
        }
    }
      

  5.   

    另外,验证结果最好不要alert,这个也可能造成与onblur的死锁。改成动态添加div提示。
      

  6.   

    汗!你喜欢用onblur
    但又说它死锁
    onblur="this.focus()"
    这个怎么个死循环了?
      

  7.   

    chinmo:他说的是真的,当两个域都用onblur=this.focus()时,肯定是会死锁的。
    比如A和B都绑定了onblur=this.focus();当从A把焦点移到B时,A触发了onblur事件,并试图把焦点转移到B,此时又触发了B的onblur事件。于是就-----“死锁”啦。
      

  8.   

    sorry:"并试图把焦点转移到B"应为"并试图把焦点转移到A"
      

  9.   

    onbeforedeactivate="if(this.value!=1)this.focus()"
    另外,用blur也没错,
    有一点要注意:不要同时让两个输入框里都有非法的值
    要做到这一点,只需保证所有的默认值都合法就成:
    默认值包括:devaultValue/js赋进的值
    空值应该是合法的(不应该在离开焦点时进行必须验证).
      

  10.   

    onbeforedeactivate="if(this.value!=1) return false;"