是否存在一个规范,即元素的id应该成为全局变量?

Nam*_*ame 39 html javascript dom global-variables identifier

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

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

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

另外我感兴趣的是,如果我有一个id为div aa在我的脚本中也有一个全局变量,Chrome将如何解决这种歧义.这种行为是随机的还是笨拙的?

如何将一个id由连字符(" - "),冒号(":")和句点(".")组成的元素进行翻译(好吧我知道它们可以被访问document.getElementById但浏览器将如何将其转换为表示它们的全局变量)

小智 40

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

HTML4规范没有描述此行为(参见http://www.w3.org/TR/1999/REC-html401-19991224/struct/global.html#adef-idhttp://www.w3. org/TR/1999/REC-html401-19991224/types.html #type-name).但是,它是由Internet Explorer引入的,然后在其他主要浏览器中复制以实现兼容性.FireFox也会显示此行为,但仅限于怪异模式(即使这样,它的实现也会出现问题).

WHATWG HTML规范目前需要此行为,但有一个开放的错误请求将其删除.

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

WHATWG邮件列表上对此行为进行了较长时间的讨论.

  • +1 *出色的答案*-保持几乎完美的npov (2认同)
  • 感谢您实际讨论规格以及围绕该规格进行咨询的问题。(严重的是,它令人耳目一新。)而且,将来还会有一些消息:“在窗口对象上的命名访问”现在也出现在W3C HTML5.1和5.2建议以及5.3工作草案中。因此,这是目前的标准,并不是说我感到高兴。 (2认同)

Rob*_*obG 11

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

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

编辑

回答你的额外问题:

...如果我有一个带有id a的div但是在我的脚本中有一个名为a的全局变量,Chrome将如何解决这种歧义.

在IE(引入此行为)中,如果声明的全局变量具有与元素id或名称相同的名称,则它将优先.但是,未声明的全局变量不会那样工作.在Chrome中测试它并不需要太多(我有,但我不会给你答案).

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

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

  • “不需要花太多时间在Chrome中进行测试(我有,但是我不会给您答案。”无益和精英。对于任何感兴趣的人,最后声明的变量将优先。 (2认同)

cgp*_*cgp 5

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

IE 也会这样做,它让一些人感到头疼。

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

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

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

它不能保持一致。