是否有规范元素的 id 应该设为全局变量?

IT技术 javascript html dom global-variables identifier
2021-01-27 23:04:23

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

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

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

此外,如果我有一个带有 id 的 divaa在我的脚本中也有一个全局变量,我对 Chrome 将如何解决歧义感兴趣行为会是随机的和古怪的吗?

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

5个回答

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

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 也显示此行为,但仅在quirks 模式下(即使这样它的实现似乎也有问题)。

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

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

WHATWG 邮件列表上有更多关于此行为的讨论

更新:删除它的错误现在被标记为已解决(它仅在 quirks-only 模式下有效)。
2021-03-15 23:04:23
正如@johncip 所说,它现在是 HTML5 的“标准功能”。参见:html.spec.whatwg.org/multipage/...但是你应该避免使用它...
2021-03-28 23:04:23
感谢您实际讨论规范以及要咨询的问题。(说真的,它令人耳目一新。)此外,一些来自未来的消息:“窗口对象上的命名访问”现在也出现在 W3C HTML5.1 和 5.2 建议以及 5.3 工作草案中。所以,这是目前的标准,并不是说我从这样说中得到任何快乐。
2021-03-30 23:04:23

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

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

编辑

回答您的额外问题:

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

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

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

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

通过已声明和未声明的全局变量。你的意思是有和没有var关键字?
2021-03-24 23:04:23
“不应该花太多时间在 Chrome 中测试它(我有,但我不会给你答案” 无益和精英主义。对于任何感兴趣的人,最后声明的变量将优先。
2021-03-28 23:04:23

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

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

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

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

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

它不能保持一致。

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

迟到的评论但是,在 HTML 文档的 DOM 级别 1 中引入了 getElementById。所有支持 Javascript 的浏览器都支持它。
2021-03-21 23:04:23

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

例如,如果您在添加 Performance API 之前拥有此功能

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

然后这段代码现在在最近的浏览器中将停止工作,这些浏览器将 Performance API 实现performance为添加了全局对象。

这不完全是一个答案。当它询问规范以及如何解决冲突命名时。不仅仅是为什么不这样做。
2021-03-25 23:04:23