考虑这个HTML源代码:在IE和Opera中添加名称属性导致ID值成为文档对象的属性?
<form id="foo1" name="x"> Form 1 </form>
<form id="foo2"> Form 2 </form>
正如你所看到的,我们定义了两个表单元素。
在Chrome,Safari和Firefox中,document.foo1
和document.foo2
均返回undefined
。
但是,在IE和Opera中,document.foo1
返回对相应FORM元素的引用,而document.foo2
返回undefined
。
现场演示:http://jsfiddle.net/zrmEm/2/
所以,第一种形式确实有它的ID命名的属性的文档对象,第二个表格没有。这种差异是将name
属性添加到第一种形式的结果。
现在,那里的逻辑在哪里?这是一个已知的行为吗?
你应该简单地忽略这些浏览器做的和不做的全局变量,因为你不应该使用它们。他们不是标准的。使用'document.getElementById()'获得一个带有id的对象的DOM引用。它不同于一个浏览器的原因是它不是由标准定义的。 – jfriend00
只是不要让Google知道它,否则他们会将其添加到Chrome的下一个版本中。我的意思是他们已经得到了'document.all'和'window.event'的好处。似乎他们暗中想成为IE! – user113716
@Ӫ_._Ӫ为时已晚。 Chrome浏览器(以及其他浏览器)确实添加了“遍布全球”的窗口和文档属性。例如,对于上面的HTML代码,Chrome会创建3个全局属性:'window.foo1','window.foo2'和'window.x',以及一个文档属性:'document.x'(所有这些都是对表格)。这种全球命名空间污染至少可以说是令人不安的,但除了Firefox(!!)之外的所有浏览器都这样做。 **演示:** http://jsfiddle.net/c4tTw/ –