<div id='a'>
,则可以在javascript中执行a.stuff()
(就好像a
是全局变量一样)。但这不适用于FireFox-我将需要使用
document.getElementById('a')
。这里的正确行为是什么? (根据W3规范)
此外,如果我的ID为
a
的div却在脚本中也具有名为a
的全局变量,那么我会对Chrome如何解决歧义性感兴趣。 该行为将是随机的吗?
以及具有连字符(“-”),冒号(“:”)和句点(“。”)的id的元素将如何翻译? (好吧,我知道可以使用
document.getElementById
来访问它们,但是浏览器将如何将其转换为表示它们的全局变量)#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
评论
另请参见具有id的DOM树元素是否成为全局变量?为什么我们不只使用元素ID作为JavaScript中的标识符?关于为什么不应该使用它的原因。有关HTML5的答案在这里。简而言之:是的,它现在已经标准化了,但是标准本身不建议这样做。
规范在这里:html.spec.whatwg.org/multipage/…