【问题标题】:Adding name attribute results in ID value becoming property of the document object in IE and Opera?添加name属性导致ID值成为IE和Opera中文档对象的属性?
【发布时间】:2011-11-28 03:20:03
【问题描述】:

考虑这个 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 属性的结果。

现在,其中的逻辑在哪里?这是已知行为吗?

【问题讨论】:

  • 你应该忽略这些浏览器为你做和不做的全局变量,因为你不应该使用它们。它们不是标准的。使用 document.getElementById() 获取对具有 id 的对象的 DOM 引用。它从一个浏览器到另一个浏览器不同的原因是它不是由标准定义的。
  • 请不要让 Google 知道这件事,否则他们会将其添加到下一个版本的 Chrome 中。我的意思是他们已经得到了 document.allwindow.event ,看在上帝的份上。看来他们暗地里想成为IE!
  • @Ӫ_._Ӫ 为时已晚。 Chrome(和其他浏览器)确实“到处”添加窗口和文档属性。例如,对于上面的 HTML 代码,Chrome 会创建 3 个全局属性:window.foo1window.foo2window.x,以及一个文档属性:document.x(所有这些都是对表单的引用)。这种全局命名空间污染至少可以说有点令人不安,但除了 Firefox (!!) 之外的所有浏览器都会这样做。 演示: jsfiddle.net/c4tTw
  • 不仅如此,opera 和 IE(甚至是#10)都将带有 id 的所有内容添加到窗口对象。 alert(elementid) 返回对该对象的引用,就像是全局变量一样。而且你非常小心,没有污染全局命名空间......
  • WHAT WG IRC 频道的主题浮现在脑海中:“请把你的逻辑意识留在门口,谢谢。”。不,这没有逻辑。 Opera 决定(暂时)这样做,因为我们找到了一个依赖它的页面。如果我们认为我们可以在网络上摆脱它,我们可能会决定在不久的将来停止这样做。所以请帮助我们放弃它 - 不要编写任何依赖于这个怪癖的脚本:)。

标签: javascript html internet-explorer dom opera


【解决方案1】:

在所有浏览器中,表单的 name 属性的值被添加为文档对象的属性,也作为 document.forms 的属性添加@987654321 @。

如果您使用 id,则这些值仅作为 forms 集合的属性添加。

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

因此,如果您总是使用 document.forms['name-or-id'],那么生活是甜蜜的。只要您没有与其他具有 id 的表单名称相同的表单,那么所有的赌注都没有。

【讨论】:

  • eh...据我所知,您的答案是准确的,而且您的表达比我的要好。所以我刚刚删除了我的:P
  • 补充一点,重要的是要注意ids 和names 位于同一个命名空间中。如果您有一个独特的元素应该具有name 属性,那么让idname 匹配是明智的。
【解决方案2】:

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

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

这是非标准的,但在当时似乎并不重要(至少对浏览器供应商而言不是)。

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

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

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

在那个时候,Opera 是浏览器世界中年轻的伪装者。它经常更新,具有创新功能,并且运行速度比竞争对手快得多。他们当时正在为浏览器世界做 Chrome 最近所做的事情。

然而,由于标准战争不断升级,Opera 唯一能与之竞争的方式就是兼容,他们不遗余力地对 IE 中的所有功能(甚至在某些情况下甚至是错误)进行逆向工程,以便网站编写for IE 也可以在 Opera 中使用。

这显然是这些功能之一,这就是为什么 IE 和 Opera 在今天都有相同的怪癖。

当今市场上的其他浏览器没有相同的历史。 Firefox 最终是从 Netscape Navigator 派生的,所以虽然它可能有自己的怪癖可以追溯到那个时代,但它不会共享 IE。而且 webkit 浏览器的出处要近得多(它源自 KDE 项目的 KHTML 引擎),所以它再一次没有尝试模仿 IE 的怪癖的历史。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 2021-01-06
    相关资源
    最近更新 更多