关于javascript:是否存在将元素ID设置为全局变量的规范?

Is there a spec that the id of elements should be made global variable?

如果我在Chrome中有一个,那么在javascript中我可以做a.stuff()(就像a是一个全局变量一样)。

但是,这不适用于FireFox-我将需要使用document.getElementById('a')

这里的正确行为是什么? (根据W3规范)

另外,如果我的ID为a的div但脚本中也有一个名为a的全局变量,我会对Chrome如何解决歧义感兴趣。 行为会变得随意又古怪吗?

以及ID由连字符("-"),冒号(":")和句点("。")组成的元素的翻译方式(好,我知道可以使用document.getElementById访问它们,但是浏览器如何翻译) 放入代表它们的全局变量中)


这取决于您阅读的规格。 :)

HTML4规范(请参见http://www.w3.org/TR/1999/REC-html401-19991224/struct/global.html#adef-id和http://www.w3。 org / TR / 1999 / REC-html401-19991224 / types.html#type-name)。但是,它是Internet Explorer引入的,然后为了兼容而复制到其他主要的浏览器中。 FireFox也显示此行为,但仅在怪癖模式下显示(即使如此,其实现也似乎有问题)。

WHATWG HTML规范当前需要此行为(要求将其删除的错误报告已关闭WONTFIX)。

无论是否符合规范,通常将全局名称空间(即window)用于应用程序代码被视为不良行为。考虑使用document.getElementById()或jQuery便捷方法(例如$("#a"))并使用函数作用域变量来引用元素ID,以避免将新变量引入全局命名空间。

WHATWG邮件列表中对此行为进行了更长时间的讨论。


从早期开始,IE就创建了全局变量,这些全局变量通过元素的名称或id属性值来引用它们。这从来都不是一个好主意,但是为了与为IE创建的网站兼容,其他浏览器已将其复制。

这是一个坏主意,不应复制或使用。

编辑

要回答您的其他问题:

...how will Chrome resolve the
ambiguity if i have a div with id a
yet have a global variable called a
too in my script.

在IE(引入了这种行为)中,如果声明的全局变量的名称与元素ID或名称相同,则它将具有优先权。但是,未声明的全局变量不能那样工作。在Chrome中测试不需要花太多时间(我有,但我不会给你答案)。

And how would an element with id
consisting of hyphens ("-"), colons
(":"), and periods (".") be translated
(ok i know they can be accessed with
document.getElementById but how will
the browser translate it into the
global variable that was representing
them)

与不是有效标识符的任何对象属性名称完全相同-方括号表示法(即window ['name-or-id'])。


从技术上讲,这个问题是观点,但这是一个好问题。

IE也可以做到这一点,这给某些人带来了麻烦。

JavaScript中变量的命名规则和HTML中ID的命名规则不同。我看不到这是一件好事。

例如,此页面上有一个ID为" notify-container"的元素。那根本不是一个有效的JavaScript名称。

另外,这些名称何时绑定?如果内联脚本声明了一个变量,然后该元素稍后出现,哪个优先?

不能使其一致。


以这种方式使用元素的最糟糕的事情是,如果引入的新API在全局范围内具有相同的名称,则它们可能随时中断。

例如,如果您在添加Performance API之前就已经这样做了

1
2
3
4
<p id="performance">
</p>

    performance.innerHTML ="You're doing great"

然后,该代码段现在将在已添加Performance Performance API的最新浏览器中停止工作,这是添加了全局performance对象。


我认为到目前为止,大多数浏览器都支持document.getElementById。使用此浏览器更好,更安全。