IE下document.getElementById的处理方式

今天在调试之前的一个测试页面时,在IE下发现了一个非常诡异的问题,用document.getElementById取不到预期的值,分析原因后发现,通过getElementById获取节点的时候,IE会把name属性当成id属性来处理。下面给出代码及解决方法,如果大家遇到此问题可以采取本文中的方法来处理。

为了精简,在页面中只放了下面的html代码:

<input id=”texturl” type=”text” name=”url” value=”first” size=”60” /><br />
<input id=”url” type=”text” name=”logo” value=”sencond” size=”60” />

然后加上javascript代码:

alert(document.getElementById(“url”).value);

结果是什么呢,你有可能非常迅速的说出结果:”second”,但是真正x结果却出人意料:”first”。

原因就是name=”url”的input框出现在id=”url”的input前面,而且它的name属性和第二个input的id一样,就导致了,IE选取了第一个input(既然是getElementById了,IE为啥还会出这种问题呢)。

解决方法有几个,最简单的就是换个名或ID呗,但是有可能由于某些原因你的html结构不能变了,那怎么办呢?你可能想到了,重写document.getElementById这个方法。这是可以的,但本人不推荐直接重写掉原生的这个方法,不过可以新增一个哦。

var getElementById = function(el){
var id = el;
el = document.getElementById(el);
if(el.id === id)
return el;
else{
var nodes = document.all[id];
for(var i = 0,len = nodes.length;i < len;i ++)
if(nodes[i].id == id)
return nodes[i];
}
}

alert(getElementById(“url”).value);
或者:

var getElementById = function(el){
var id = el;
el = document.getElementById(el);
if(el.id === id)
return el;
else{
var nodes = document.all[id];
for(var i = 0,len = nodes.length;i < len;i ++)
if(nodes[i].id == id)
return nodes[i];
}
}
document.getElementByIdNew = getElementById;
alert(document.getElementByIdNew(“url”).value);

这样就解决了问题了,这种问题只在IE下存在,而且IE6-9都这样,我在网上的一篇文章看说是只有IE7前的版本有这问题,但经过测试IE8-9也这样。