Javascript 是否有一个规范规定元素的id应该是全局变量?

Javascript 是否有一个规范规定元素的id应该是全局变量?,javascript,html,dom,global-variables,identifier,Javascript,Html,Dom,Global Variables,Identifier,如果我在Chrome中有一个,那么在javascript中我可以做a.stuff()(这就像a是一个全局变量一样) 但是这不适用于FireFox-我需要使用document.getElementById('a') 这里的正确行为是什么?(根据W3规范,即) 另外,如果我有一个id为a的div,但在我的脚本中也有一个名为a的全局变量,那么Chrome将如何解决这种歧义。这种行为会是随机的和古怪的吗 以及如何翻译id由连字符(“-”)、冒号(:”)和句点(“.”)组成的元素(好吧,我知道它们可以通过

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

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

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

另外,如果我有一个id为
a
的div,但在我的脚本中也有一个名为
a
的全局变量,那么Chrome将如何解决这种歧义。这种行为会是随机的和古怪的吗


以及如何翻译id由连字符(“-”)、冒号(:”)和句点(“.”)组成的元素(好吧,我知道它们可以通过
document.getElementById
访问,但浏览器如何将其翻译成表示它们的全局变量)

技术上,这个问题是观点,但这是个好问题

命名和命名的规则是不同的。我看不出这是件好事

例如,在这个页面上有一个ID为“notifycontainer”的元素。这根本不是一个有效的JavaScript名称

还有,这些名字什么时候绑定?如果一个内联脚本声明了一个变量,然后该元素随后出现,那么哪个具有优先级


它不能保持一致。

从很早的时候起,IE就创建了全局变量,通过名称或id属性值引用元素。这从来不是一个好主意,而是被其他浏览器复制,以便与为IE创建的站点兼容

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

编辑 要回答您的额外问题,请执行以下操作:

…Chrome将如何解决此问题 如果我有一个id为a的div,则不明确 但是有一个全局变量称为 在我的剧本中也是如此


在IE(它引入了这种行为)中,如果一个全局变量声明为与元素id或名称相同的名称,它将优先。然而,未声明的globals不是这样工作的。在Chrome中测试这一点应该不需要太多(我有,但我不会给你答案)

一个id为的元素将如何 由连字符(“-”)和冒号组成 (“:”)和句号(“.”)可以翻译 (好的,我知道可以通过 document.getElementById但如何 浏览器会将其转换为 表示的全局变量 (他们)


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

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

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

HTML4规范(c.f.和)没有描述这种行为。然而,它是由InternetExplorer引入的,然后为了兼容性被复制到其他主要浏览器中。FireFox也显示了这种行为,但只在中显示(即使这样,它的实现也似乎有缺陷)

WHATWG HTML规范当前正在执行此行为(请求删除该行为的报告已在WONTFIX中关闭)

不管是否符合规范,对应用程序代码使用全局名称空间(即
窗口
)通常被认为是不良行为。考虑使用<代码>文档.GETelEnMyIdId()/代码>或jQuery便利方法引用元素ID(例如,<>代码($)(y.a))/使用函数范围变量,以避免将新变量引入全局命名空间。


关于这种行为,在上有一个较长的讨论。

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

例如,如果您在添加性能API之前就有了此功能

<p id="performance"></p>
<script>
    performance.innerHTML = "You're doing great"
</script>

performance.innerHTML=“你做得很好”

那么,在最近的浏览器中,当声明和未声明的globals添加了一个global
Performance
对象时,这段代码就会停止工作。你是说有没有
var
关键字?“在Chrome中不需要太多测试(我有,但我不会给你答案”对任何感兴趣的人来说,最后一个声明的变量都将优先。晚评论,但是,getElementById是在DOM级别1中为HTML文档引入的。所有支持Javascript的浏览器都支持它。另请参见以及为什么不应使用它。关于HTML5的答案是。简言之:是的,它现在是标准化的,but不是标准本身推荐的。规范在这里:这并不是一个确切的答案。因为它询问规范和冲突命名是如何解决的。不仅仅是为什么不这样做。更新:删除它的错误现在被标记为已解决已修复(它只在怪癖模式下工作)。感谢您实际讨论规范以及需要参考的相关问题。(说真的,这让人耳目一新。)此外,还有一些来自未来的新闻:“窗口对象的命名访问”现在也出现在W3C HTML5.1和5.2建议以及5.3工作草案中。因此,在这一点上,它是一个标准,并不是说我从这样说中得到了任何乐趣。正如@johncip所说,它现在是HTML5上的一个“标准功能”。请参阅:但您应该避免使用它。。。