getElementById兼容性

getElementById在IE6,7下存在几处bug

# 无法区分name属性和id属性。如果name值和id的值相同会造成选择性错误。
# 不区分 字母大小写

 

 1 <form action="" id="form">
 2     姓名:<input type="text" name="name" value="尼古拉斯赵四">
 3     年龄:<input type="text" name="age" value="18">
 4     小名:<input type="text" name="littleName" id="name" value="赵四">
 5     ID=id:<input type="text" id="id" value="ID=id">
 6 </form>
 7 
 8 <script type="text/javascript">
 9     /**
10      * 主要测试的就是IE 6,7
11      * @type {[type]}
12      */
13     var little_name=document.getElementById('name');
14     console.log(little_name.value);//日志: 尼古拉斯赵四 
15 </script>

 

# 表单form 中元素有id=id时 选择表单时如果是直接用.id的方式来取值或者getAttribute(id)时返回元素本身的toString()。

1 var oForm=document.getElementById('form');
2 var oId=document.getElementById('id');
3 
4 //#[2]
5 console.log(oForm.id);//返回id=id元素本身的toString(),实际上应该输出form    
6     
7 //#[3]
8 console.log(oForm.getAttribute('id'));//IE7下 日志: [object] 

 

#如何编写一个兼容IE6,7的方法呢

 1 function newGetElementById(el,id,ignoreId){
 2          var sEl;
 3          //IE类型的判断最好放在外部单独判断 这样就无需每次执行函数时判断
 4          var isIE67=true;  
 5          
 6          if(typeof el=='string'){
 7              ignoreId=id;
 8              id=el;
 9              el=document;
10          }else if(el.nodeType!=1||el!=document){
11              return null;
12          }
13          if(ignoreId==undefined){
14              ignoreId=true;
15          }
16          sEl=el.getElementById(id);
17          //是否忽略form 下表单元素id=id的情况存在
18          //主要是这种情况在开发时几乎很少出现,为了提高获取元素的效率而做了忽略
19          if(!isIE67){
20 
21              if(ignoreId){
22                  return sEl
23              }else{
24                  if(sEl.nodeType==1&&sEl.attributes['id'].value==id){
25                      return sEl;
26                  }
27              }
28          }else{
29              var els=document.all[id],eli;//这里要注意下 els中包含了name==id的标签
30              for(var i=0;eli=els[i];i++){
31                  console.log(els.length);
32                  try{
33                      //name==id 且没有id属性时再IE6,7下空 会报异常(WIN7系统测试)
34                      if(eli.nodeType==1&&(eli.attributes['id']&&(eli.attributes['id'].value==id))){
35                          return eli;
36                      }    
37                  }catch(e){
38                      
39                  }
40              }
41 
42          }
43          return null;
44     }

 

posted @ 2018-04-20 10:06  笑耗子ok  阅读(187)  评论(0)    收藏  举报