2011-10-19 21 views
22

可能重复:
IE/Chrome: are DOM tree elements global variables here?
why window[id] === document.getElementById(id)直接引用的HTML元素

我刚刚遇到的HTML/JavaScript的东西已经让我吃惊了一下。当使用javascript获取html元素的引用时,我以前一直使用jQuery或document.getElementById。它似乎也可以简单地通过使用它的id来直接访问元素。有人可以解释这个细微差别吗?我已经使用Google搜索,但找不到任何对此功能的引用,每个网站都会讨论getElementById。

以下页面片段说明了这一点。

<html> 
<head> 
</head> 
<body> 
    <input type="button" value="getElement" onclick="document.getElementById('blah').innerText = 'getElementById'" /> 
    <input type="button" value="direct" onclick="blah.innerText = 'direct';" /> 
    <div id="blah"></div> 
</body> 

许多在此先感谢。

+0

+1以前没有碰到过这个,但肯定是工作的:http:// jsfiddle。净/ qdrAr/ – Clive

+0

你在验证了这一点哪些浏览器?无法通用,因为它可能无法在所有浏览器中运行。 –

+0

这不是跨浏览器。一些浏览器可能已经开始支持它,但不是全部,但不是老版本。 – Nikoloff

回答

14

能够根据页面的[id]来选择页面上的元素是早期JavaScript(DOM lvl 0或1 methinks,似乎无法找到源代码)的“特性”。

不幸的是,这是一个气质的特征。如果您有会发生什么:

<div id="window"></div> 

<div id="document"></div> 

更重要的是,这里是什么情况?

<div id="foo"></div> 
<div id="bar"></div> 
<script>var foo = document.getElementById('bar');</script> 

所以细微之处调用基于它的元素[id]很简单:

不要使用它。

这是不一致的,不保证将来得到支持。

我个人希望看到这个“功能”去document.all的方式。它只会导致比解决问题更多的问题,而document.getElementById,虽然当然冗长,是有意义和可以理解的。

+0

我当然同意***“不要使用它”***,但不幸的是它已经进入[HTML5工作草案](http://www.w3.org/TR/html5/browsers。 HTML#命名访问上的窗口对象)。关于它的一个[正在进行的讨论](http://www.w3.org/Bugs/Public/show_bug.cgi?id=11960),可以预见的是,微软正在推动标准化,而Mozilla正在努力限制“特性“只怪癖。从我所看到的,微软声称改变IE的行为会破坏一些网站。 –

+1

@AndyE,改变*什么*将打破一些网站。这是因为从工作到破碎的地点范围是连续的,而不是离散的。有*许多*网站已被打破。 – zzzzBov

2

使用getElementById更灵活可读。举例来说,这是不行的:

<input type="button" value="direct" onclick="document.innerText = 'direct';" /> 
<div id="document"></div> 

出于显而易见的原因,但这:

<input type="button" value="getElement" onclick="document.getElementById('document').innerText = 'getElementById'" /> 
<div id="document"></div> 

而且它更清楚其他开发者究竟发生了什么事情。

0

我不认为这是一个文档化的功能,它似乎不适用于Firefox(6),但它似乎可以在最新版本的Chrome以及IE 6-9中使用。

我不会依赖它,只会认为它是浏览器功能的一个古怪之处。