我看到了一种奇怪的行为。
我创建了一个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-m
和firefox 15.0.1
进行了测试。
答案 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
仍然更快,使得此变量访问更不可取。