可通过ID访问的元素

时间:2012-09-30 18:47:09

标签: javascript

我看到了一种奇怪的行为。 我创建了一个Input

<input id='inputid' value='value'/>​

并尝试直接从id访问它。而不是抛出异常控制台显示上面的输入元素。

console.log(inputid);

之后我尝试将其与getElementById

进行比较
console.log( inputid == document.getElementById('inputid'));

控制台显示true

您可以在jsfiddle上看到此行为。

这是一种奇怪的行为还是我错过了什么?

我在Chrome 23.0.1271.10 dev-mfirefox 15.0.1进行了测试。

2 个答案:

答案 0 :(得分:6)

回到4.0浏览器时代,Microsoft决定为每个带有id的元素创建一个全局变量,其名称与包含对该元素的引用的id相同。

在其他一些浏览器中(在某些渲染模式下)出现了对此的支持。这种支持不是通用的,因此应避免使用该功能。

答案 1 :(得分:3)

根据好奇心,稍微扩展一下这种情况:

<html><head>
<script type="text/javascript">
  var overWrite = "world";
  window.onload = function(){ alert(overWrite); };
</script></head><body>
<input id="overWrite" value="hello" />
</body></html>

会提醒“世界”。但是,对于//var overWrite = "world";(与该行已注释掉),它会提醒[html element]。请注意,这是在页面加载之后,因此它是持久的,而不是某种临时分配。

强烈同意由于不一致和可读性问题而不应使用。

修改

对此问题仍然感到好奇,并做了一些更多测试。如果使用document.getElementById或变量引用访问速度更快,我很好奇。做了这个测试:

HTML

<div id="contentZone"></div>

JS

var startTime = Date.now();
for( var i = 0; i < 1000; i++){
    for( var n = 0; n < 2000; n++){
        var ni = document.getElementById("contentZone");
    }
}
var endTime = Date.now();
console.log( endTime - startTime );

var aTime = Date.now();
for( var i = 0; i < 1000; i++){
    for( var n = 0; n < 2000; n++){
        var ni = contentZone;
    }
}
var bTime = Date.now();
console.log( bTime - aTime );

控制台

431
814

仅在此计算机上测试,但似乎使用document.getElementById仍然更快,使得此变量访问更不可取。