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