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

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

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

此外,如果我的ID为a的div却在脚本中也具有名为a的全局变量,那么我会对Chrome如何解决歧义性感兴趣。

该行为将是随机的吗?

以及具有连字符(“-”),冒号(“:”)和句点(“。”)的id的元素将如何翻译? (好吧,我知道可以使用document.getElementById来访问它们,但是浏览器将如何将其转换为表示它们的全局变量)

评论

另请参见具有id的DOM树元素是否成为全局变量?为什么我们不只使用元素ID作为JavaScript中的标识符?关于为什么不应该使用它的原因。
有关HTML5的答案在这里。简而言之:是的,它现在已经标准化了,但是标准本身不建议这样做。

规范在这里:html.spec.whatwg.org/multipage/…

#1 楼

这取决于您阅读的规格。 :)
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邮件列表上对此行为的讨论已有很长的讨论。 br />

评论


更新:删除它的错误现在标记为RESOLVED FIXED(仅适用于怪癖模式)。

– SilverWolf-恢复莫妮卡
18-10-3在23:20

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

– johncip
19年2月26日在7:17

正如@johncip所说,这是HTML5上的“标准功能”。请参阅:html.spec.whatwg.org/multipage/…但您应避免使用它...

– marciowb
19-10-9在19:10

#2 楼

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

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

编辑

要回答您的其他问题:


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


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


以及id为
的元素将如何?由连字号(“-”),冒号
(“:”)和句点(“。”)组成的翻译
(好的,我知道可以使用
document.getElementById对其进行访问,但是
浏览器如何将其转换为表示它们的全局变量


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

评论


由已声明和未声明的全局变量组成。你的意思是有和没有var关键字?

–名
2011年6月17日7:00

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

–聚鸭
18-3-16在11:05



#3 楼

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

IE也这样做,这引起了某些人的头痛。

JavaScript和HTML中的ID不同。我看不到这有什么好处。例如,在此页面上,有一个元素的ID为“ notify-container”。那根本不是一个有效的JavaScript名称。

这些名称何时绑定?如果内联脚本声明了一个变量,然后该元素出现在后面,则它具有优先权?

它不能保持一致。

#4 楼

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

评论


最新评论,但是getElementById在DOM Level 1中引入了HTML文档。所有支持Javascript的浏览器都支持它。

– rlemon
2014年1月3日,14:28

#5 楼

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

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

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


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

评论


这不完全是答案。在询问规范以及如何解决冲突命名时。不只是为什么不这样做。

–库珀·白金汉
18年6月4日在1:13