有没有一个规范,元素的id应该是全局变量?

如果我在Chrome中有<div id='a'> ,那么在JavaScript中我可以做a. stuff() a. stuff() (就好像a是一个全局变量)。

然而,这不适用于FireFox – 我将需要使用document.getElementById('a')

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

此外,我感兴趣的是,如果我有一个ID a ID a div,但是在我的脚本中有一个叫做“太”的全局变量,Chrome将如何解决歧义。 行为是随机的,怪异的?

如何翻译由连字符(“ – ”),冒号(“:”)和句点(“。”)组成的元素(好吧,我知道他们可以用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规范目前需要这种行为,但有一个开放的错误,要求将其删除。

不管规范如何遵守,对应用程序代码使用全局命名空间(即window )通常被认为是不好的行为。 考虑使用document.getElementById()或jQuery便捷方法(例如$("#a") )引用元素ID,并使用函数范围变量来避免将新变量引入全局名称空间。

有关WHATWG邮件列表上的这种行为的更长时间的讨论。

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

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

编辑

要回答你的额外问题:

…如果我有一个ID为ID的div但是在我的脚本中有一个叫做“太”的全局变量,Chrome将如何解决歧义。

在IE中(引入了这个行为),如果一个全局变量被声明为一个元素id或名字相同的名称,它将采取主持。 但是,未声明的全局变量不能这样工作。 在Chrome浏览器中测试(我有但我不打算给你答案)。

如何翻译由连字符(“ – ”),冒号(“:”)和句点(“。”)组成的元素(好吧,我知道他们可以用document.getElementById访问,但浏览器将如何翻译它进入代表它们的全局变量)

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

从技术上讲,这个问题是意见,但这是一个很好的问题。

IE也这样做,它已经引起了一些头痛。

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

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

另外,这些名字是什么时候绑定的? 如果一个内联脚本声明一个变量,然后该元素出现后,有优先?

这是不能一致的。

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

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

例如,如果您在添加Performance API之前有此操作

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

那么这段代码现在已经停止工作了,在最近实现了Performance API的浏览器中添加了一个全局performance对象。