我写了一个注册表单 就拿用户名和密码为例吧
  用户名 文本框丢失焦点会调用一个方法来验证是否为空 把错误信息用innerHTML的方法插入旁边的表格。最后还得到用户框的焦点全选select() 返回false;
  密码框 丢失焦点也一样会调用一个方法来验证密码是否为空 把错误信息用innerHTML的方法插入旁边的表格。 最后 还是获取到密码框的焦点全选select() 返回false;  问题来了:
  我网页打开时候默认的焦点是在用户名框。
  如果我不写用户名而直接去点密码框 悲剧就产生了,在旁边的表格中提示出了两个框的输入错误信息,
  两个框框相互争夺焦点 成了循环了  不知道各位出现过这个情况没有。  说是为了人性化 输入有误后会在错误的文本框选中方便用户再次修改输入。
  
  难道不把获取焦点那句全选删了 就没有别的方法么?  以下是部分代码  表单是表格的,写出来太花眼了就没写、  
<script language="javascript">function checkU(){
var name = document.f1.username.value;

/***  用户名的验证  ***/
if(name==""||name.length==0){
checku.innerHTML="<font color='red'>用户名不能为空</font>";
//alert('用户名不能为空');
document.f1.username.select();
return false;
}else{
if(!/^[0-9a-zA-Z]+$/.test(name)){
checku.innerHTML="<font color='red'>用户名只能由数字和字母组成</font>";

document.f1.username.select();
return false; }else{
checku.innerHTML="<font color='green'>恭喜,用户名可以注册</font>";
return true;

} function checkP(){
var pass1 = document.f1.password1.value;
var pass2 = document.f1.password2.value;

/**  密码框的验证 ***/
if(pass1==""||pass1.length==0){
checkp.innerHTML="<font color='red'>密码不能为空</font>";

document.f1.password1.select();
 
return false;
}else{
if(pass1.length>6&&pass1.length < 15){
//如果密码长度足够
checkp.innerHTML="<font color='green'>√</font>";
/***  密码相同验证  ***/
if(pass1 != pass2  ){

checksp.innerHTML="<font color='red'>两次密码输出不一样</font>";
document.f1.password2.select();
return false;
}else{
checksp.innerHTML="<font color='green'>√</font>";
return true;
}
  
}else{

checkp.innerHTML="<font color='red'>密码长度大于6位且小于15位</font>";
document.f1.password1.select();
return false;
}

}



}<script ><form  name="f1" action="" method="post" onsubmit="return checkU()&&checkP()">
用户:<input type="text" name="username" onblur="checkU();"><br>
密码:<input type="password" name="password1"   onblur="checkP();"><br>
密码确认:<input type="password" name="password2" ><br>
<input type="submit"  value="提交"  />
<input type="reset" value="取消" /> 
</form>

解决方案 »

  1.   

    不是很明白你的意思。但焦点在某一时刻只是一个地方获得,不可能争用吧。况而你获取对象后就return了,不会现往下执行了,怎么可能争用呢。
      

  2.   

    回licip: 
            但真的就在争夺焦点似的、光标上下两个框来回走动、并且类似IE死了的样子 崩了感觉、        ie打开后  光标在 用户框上, 我没输入任何东西而直接去点了密码框、
            用户框失去焦点  然后去判断并且把光标返回到了用户框上、
            因为我密码框什么也没输入  而且刚才用户框的判断把我的焦点回到了用户框上、所以密码框也算是失去了焦点、 也在调用我的验证 、并且又把光标返回到了密码框上、如此重复
      

  3.   

    个人建议:表单submit之前的那个验证就把标点放在第一个出错的input,其他的就不要放焦点了。
      

  4.   

    密码框失焦点时,判断用户名框是否为空,否执行接下来的,不然return;即可.
      

  5.   

    checkP里判断checkU的返回值
    if(checkU==false)return false;
      

  6.   

    if(checkU()==false)return false;
      

  7.   

    回复ifandui:
    这个办法好。