NiYingfeng 的博客

记录技术、生活与思考

0%

IE6关于getElementById的BUG

最近遇到一个很常见的JS在IE下的兼容性问题,其实也很简单,主要由于IE6下调试工具较少不好发现导致花费了挺多的时间。 首先说一下我遇见的关于getElementById的小小兼容性问题吧,都知道 document.getElementById 是获取DOM节点中指定id的节点,但是在IE6下,会把某些标签中(并不是所有标签)的name也当做 getElementById 可获取的元素,有时真会发生影响不到的坑。 我是在获取相应id节点后再插入一个div,没想到在head的标签内竟然将其name属性设置了可这个ID一样的名字。真是妹的我去了!!!IE6中只是看到该div不显示,真不容易发现其错误。关键是标签内无内容,弹出其innerHTML还未空。呵呵~ 下面是一些有意思的代码: 下面代码在IE6下会获取正常的DOM节点:

1
2
3
4
5
6
7
8
9
10
11
<body>
<p name="abc" id="cba">
这是第1个div
</p>
<div id="abc">
这是第2个div
</div>
<script language=javascript>
alert(document.getElementById("abc").id);
</script>
</body>

而下面代码就会有问题:

1
2
3
4
5
6
7
8
9
10
11
<body>
<a name="abc" id="cba" href="http://www.baidu.com">
这是第1个div
</a>
<div id="abc">
这是第2个div
</div>
<script language=javascript>
alert(document.getElementById("abc").id);
</script>
</body>

所以,对于IE6下 getElementById方法出现BUG也是针对于相关标签的。包括 meta标签 a标签 form标签以及一些相关表单元素。 主要解决方法是 注意整体的name使用,不要将name与id值混淆使用,这个是最优方式。 还有就是方法判断,这是司徒正南给的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var getElementById = function(id){
var el = document.getElementById(id);
if(!+"\v1"){
if(el && el.attributes['id'].value === id){
return el
}else{
var els = document.all[id],n = els.length;
for(var i=0;i<n;i++){
if(els[i].attributes['id'].value === id){
return els[i]
}
}
}
}
return el;
}