果然没说清楚...囧..
呵呵,分步说明:
1.主要功能是修改身份证的,包括验证文本域是否为空,值是否是一个有效的身份证号(功能都能实现)
2.表单由2个text、1个button和1个reset组成
3.2个txet验证功能由onBlur()完成
4.button主要验证2个text是否为空和是否相等(确认作用)
5.问题描述:
IE下,完全符合我的要求,当在第一个text中输入错误的号码,会一直提示出错光标不能定位到其他组件上
FF下,在第一个text中输入错误的号码,在第二个text中点击时,提示出错,但是,点掉错误提示框的时候光标已经在第二个text中了,在第二个text中输入与第一个text中相同的内容(2个都是错的),点击button,能提交!这就是问题,IE下不会
6.如果还没说清楚,我就...我就......算了...
下面是代码:表单:<form id="ModifyForm" name="ModifyForm" method="post" action="***" >
  <table width="500px" border="0" align="center">   
      <td><div align="right">新身份证号:</div></td>
      <td colspan="2"><label>
        <input name="newSfzh" type="text" id="newSfzh" size="40" onBlur="validId(this)"/>
      </label></td>
    </tr>
    <tr>
      <td><div align="right">请确认输入:</div></td>
      <td colspan="2"><label>
      <input name="confirmSfzh" type="text" id="confirmSfzh" size="40" onBlur="validId(this)"/>        </label></td>
    </tr>
    <tr>
      <td height="42">&nbsp;</td>
      <td width="33%"><label>        
          <input type="button" name="button" id="button" value="提交" onClick="checkNull()"/>        
          </label>
      </td>
      <td width="31%"><label>
          <input type="reset" name="reset" id="reset" value="重置" />        
          </label>
      </td>
    </tr>
  </table>
</form>表单里面引入的js文件: function checkNull() {
var flag = true;
var n = document.ModifyForm.newSfzh.value;
var c = document.ModifyForm.confirmSfzh.value;
if(n == ""||n.length==0) {
window.alert("新身份证号码不能为空!");
document.ModifyForm.newSfzh.focus;
flag = false;
} else if (c == ""||c.length==0){
window.alert("确认身份证号码不能为空!");
document.ModifyForm.newSfzh.focus;
flag = false;
} else if(n!=c){
window.alert("两次输入的身份证号码不一致,请检查后再提交!");
document.ModifyForm.newSfzh.focus;
flag = false;
}
if(flag) {
document.ModifyForm.submit();
}
}


var powers=new Array("7","9","10","5","8","4","2","1","6","3","7","9","10","5","8","4","2");
    var parityBit=new Array("1","0","X","9","8","7","6","5","4","3","2");
    //var sex="male";
    //校验身份证号码的主调用
    function validId(obj){
    
        var _id=obj.value;
        if(_id=="")return;
        var _valid=false;
        if(_id.length==15){
            _valid=validId15(_id);
        }else if(_id.length==18){
            _valid=validId18(_id);
        }
        if(!_valid){
            alert("身份证号码有误,请检查!");
            obj.focus();
            return;
        }
        //设置性别
/*
        var sexSel=document.getElementById("sex");
        var options=sexSel.options;
        for(var i=0;i<options.length;i++){
            if(options[i].value==sex){
                options[i].selected=true;
                break;
            }
        }*/
    }    
    //校验18位的身份证号码    function validId18(_id){
        _id=_id+"";
        var _num=_id.substr(0,17);
        var _parityBit=_id.substr(17);
        var _power=0;
        for(var i=0;i< 17;i++){
            //校验每一位的合法性            if(_num.charAt(i)<'0'||_num.charAt(i)>'9'){
                return false;
                break;
            }else{
                //加权                _power+=parseInt(_num.charAt(i))*parseInt(powers[i]);
                //设置性别                if(i==16&&parseInt(_num.charAt(i))%2==0){
                    sex="female";
                }else{
                    sex="male";
                }
            }
        }
        //取模        var mod=parseInt(_power)%11;
        if(parityBit[mod]==_parityBit){
            return true;
        }
        return false;
    }
    //校验15位的身份证号码    function validId15(_id){
        _id=_id+"";
        for(var i=0;i<_id.length;i++){
            //校验每一位的合法性            if(_id.charAt(i)<'0'||_id.charAt(i)>'9'){
                return false;
                break;
            }
        }
        var year=_id.substr(6,2);
        var month=_id.substr(8,2);
        var day=_id.substr(10,2);
        var sexBit=_id.substr(14);
        //校验年份位        if(year<'01'||year >'90')return false;
        //校验月份        if(month<'01'||month >'12')return false;
        //校验日        if(day<'01'||day >'31')return false;
        //设置性别        if(sexBit%2==0){
            sex="female";
        }else{
            sex="male";
        }
        return true;
    }

解决方案 »

  1.   

    不要使用 document子节点
    可以尝试使用document.getElementById()
      

  2.   

    像下面这样改一下。
    比如:
    obj.focus() 改为setTimeout(function(){obj.focus();obj.select();},10);
      

  3.   

    你的测试环境是什么?
    我在FF3,IE6下测试都没有问题。
    把修的代码给你帖出来参考一下吧。
    <html>
    <script language="javascript">
    function checkNull() {
    var flag = true;
    var obj1 = document.ModifyForm.newSfzh;
    var n = document.ModifyForm.newSfzh.value;
    var c = document.ModifyForm.confirmSfzh.value;
    if(n == ""||n.length==0) {
    window.alert("新身份证号码不能为空!");
    //document.ModifyForm.newSfzh.focus;
    var obj = document.ModifyForm.newSfzh;
    setTimeout(function(){obj1.focus();},10); flag = false;
    }
    else if (c == ""||c.length==0){
    window.alert("确认身份证号码不能为空!");
    // document.ModifyForm.newSfzh.focus;
    var obj = document.ModifyForm.newSfzh;
    setTimeout(function(){obj1.focus();},10);
    flag = false;
    }
    else if(n!=c){
    window.alert("两次输入的身份证号码不一致,请检查后再提交!");
    // document.ModifyForm.newSfzh.focus;
    setTimeout(function(){obj1.focus();},10);
    flag = false;
    }
    if(flag) {
    document.ModifyForm.submit();
    }
    }var powers=new Array("7","9","10","5","8","4","2","1","6","3","7","9","10","5","8","4","2");
    var parityBit=new Array("1","0","X","9","8","7","6","5","4","3","2");
    //var sex="male";
    //校验身份证号码的主调用  function validId(obj){
    var _id=obj.value; if(_id=="")return;
    var _valid=false; if(_id.length==15){
    _valid=validId15(_id);
    }
    else if(_id.length==18){
    _valid=validId18(_id);
    } if(!_valid){
    alert("身份证号码有误,请检查!");
    //obj.focus();
    setTimeout(function(){obj.focus();},10);
    return;
    } //设置性别 
    /*  
    var sexSel=document.getElementById("sex");
    var options=sexSel.options;
    for(var i=0; i<options.length; i++){
    if(options[i].value==sex){
    options[i].selected=true;
    break;
    }
    }
    */  
    }
    //校验18位的身份证号码  
    function validId18(_id){
    _id=_id+"";
    var _num=_id.substr(0,17);
    var _parityBit=_id.substr(17);
    var _power=0;
    for(var i=0;i< 17;i++){
    //校验每一位的合法性  
    if(_num.charAt(i)<'0'||_num.charAt(i)>'9'){
    return false;
    break;
    }
    else{
    //加权  
    _power+=parseInt(_num.charAt(i))*parseInt(powers[i]);
    //设置性别  
    if(i==16&&parseInt(_num.charAt(i))%2==0){
    sex="female";
    }
    else{
    sex="male";
    }
    }
    }
    //取模  
    var mod=parseInt(_power)%11;
    if(parityBit[mod]==_parityBit){
    return true;
    }
    return false;
    }//校验15位的身份证号码  
    function validId15(_id){
    _id=_id+"";
    for(var i=0;i<_id.length;i++){
    //校验每一位的合法性  
    if(_id.charAt(i)<'0'||_id.charAt(i)>'9'){
    return false;
    break;
    }
    }
    var year=_id.substr(6,2);
    var month=_id.substr(8,2);
    var day=_id.substr(10,2);
    var sexBit=_id.substr(14);
    //校验年份位  
    if(year<'01'||year >'90')return false;
    //校验月份  
    if(month<'01'||month >'12')return false;
    //校验日  
    if(day<'01'||day >'31')return false;
    //设置性别  
    if(sexBit%2==0){
    sex="female";
    }
    else{
    sex="male";
    }
    return true;
    }
    </script>
    <body>
    <form id="ModifyForm" name="ModifyForm" method="post" action="***" >
      <table width="500px" border="0" align="center">   
          <td><div align="right">新身份证号:</div></td>
          <td colspan="2"><label>
            <input name="newSfzh" type="text" id="newSfzh" size="40" onBlur="validId(this)"/>
          </label></td>
        </tr>
        <tr>
          <td><div align="right">请确认输入:</div></td>
          <td colspan="2"><label>
          <input name="confirmSfzh" type="text" id="confirmSfzh" size="40" onBlur="validId(this)"/>        </label></td>
        </tr>
        <tr>
          <td height="42">&nbsp;</td>
          <td width="33%"><label>        
              <input type="button" name="button" id="button" value="提交" onClick="checkNull()"/>        
              </label>
          </td>
          <td width="31%"><label>
              <input type="reset" name="reset" id="reset" value="重置" />        
              </label>
          </td>
        </tr>
      </table>
    </form>
    </body>
    </html>
      

  4.   

    额,我一直以为是上面的问题,原来是下面身份证验证那边的那个focus()问题,改成8楼那样就可以了,谢谢大家了!~