添加name属性会导致ID值成为IE和Opera中文档对象的属性吗?

时间:2011-09-30 01:28:32

标签: javascript html internet-explorer dom opera

考虑这个HTML源代码:

<form id="foo1" name="x"> Form 1 </form>
<form id="foo2"> Form 2 </form>

如您所见,我们定义了两个FORM元素。

在Chrome,Safari和Firefox中,document.foo1document.foo2都会返回undefined

但是,在IE和Opera中,document.foo1会返回对相应FORM元素的引用,而document.foo2会返回undefined

现场演示: http://jsfiddle.net/zrmEm/2/

因此,第一个表单在文档对象中具有其ID命名属性,而第二个表单没有。这种差异是将name属性添加到第一个表单的结果。

现在,那是什么逻辑?这是一种已知行为吗?

2 个答案:

答案 0 :(得分:1)

在所有浏览器中,表单的 name 属性的值将作为文档对象的属性添加,并且还作为 document.forms {{的属性添加。 3}}

如果您使用的是ids,则只会将这些值添加为表单集合的属性。

IE总是对name和id属性感到困惑。在IE(测试版本8)中,如果还有该表单的名称(可能与id相同或不同),则会在id中添加文档的属性。

所以如果你总是使用 document.forms ['name-or-id'] 那么生活就是甜蜜的。只要您没有名称与其他带有ID的表单相同的表单,那么所有的投注都会关闭。

答案 1 :(得分:1)

这基本上是微软在浏览器大战的黑暗时期引入的一个怪癖。 (大约IE4)

最终结果是,在IE中,表单将作为变量添加到文档范围中,以便您可以将它们引用为document.form1

这是非标准的,但那时候似乎并不重要(至少不是浏览器供应商)。

当时添加到一个浏览器或其他浏览器的许多非标准功能最终被其他浏览器实现,成为事实上的标准,并最终成为官方标准。

然而,这个特殊功能却没有。它仍然是非标准的。

微软保留了大部分旧的非标准功能,即使在较新版本的浏览器中也是如此,以保持旧代码的向后兼容性(许多企业内部网由Microsoft培训的“专家”编写,并使用这些功能,所以他们需要保留它们,否则没有人会升级过IE6。)

在那些日子里,Opera在浏览器领域是年轻的伪装者。它经常更新,具有创新功能,并且比竞争对手跑得更快。他们当时正在为浏览器世界做些什么,Chrome最近一直在做什么。

然而,由于升级的标准战争,Opera可以竞争的唯一方式是兼容,并且他们竭尽全力对IE中的所有功能(甚至在某些情况下是错误)进行逆向工程,以便写入网站因为IE也适用于Opera。

这显然是其中一个功能,这就是为什么IE和Opera今天都有同样的怪癖。

目前市场上的其他浏览器没有相同的历史记录。 Firefox最终来自Netscape Navigator,因此虽然它可能有自己的怪癖可追溯到那些日子,但它不会分享IE的。 webkit浏览器有一个更新近的出处(它来自KDE项目的KHTML引擎),所以它再也没有尝试模仿IE的怪癖的历史。