一尘不染

为什么我们不只使用元素ID作为JavaScript中的标识符?

javascript

我使用的所有浏览器都允许id="myDiv"通过简单的编写来访问元素:

myDiv

无论如何,这种方法似乎没有足够的文档记录,实际上,我遇到的消息来源甚至都没有提及它,而是假设有人会使用

document.getElementById("myDiv")

或许

document.querySelector("#myDiv")

访问DOM元素,即使它的ID是事先知道的(即,在运行时也不计算)。我可以说出,如果有人无意间尝试myDiv在更广的范围内重新定义(虽然不是一个很棒的主意…),用一些不同的值覆盖它,然后继续进行而又没有注意到冲突,则后一种方法的优点是可以保持代码安全。。

除此之外呢?除了代码设计以外,在使用上述简短形式时是否还有其他顾虑,或者我在这里还缺少什么?


阅读 236

收藏
2020-04-25

共1个答案

一尘不染

无论如何,这种方法似乎没有足够的文档记录,实际上,我遇到的消息来源甚至都没有提及它。[…]

除了依赖隐式声明的全局变量外,缺少文档是不使用它的重要原因。

显然,将id值提升为全局变量并不符合标准ID属性的HTML5规范未提及,因此,您不应假定将来的浏览器会实现它。

编辑:原来,这种行为 符合标准-在HTML5中,window应该支持“命名元素”访问属性:

为了上述算法的目的,具有名称name的已命名对象是: * 活动文档的名字是孩子浏览上下文 的名字 , * 具有名称内容属性(其值为 name)的 对象,小程序,区域,嵌入,表单,框架集,img或对象元素,或者 * 具有 id 内容属性,其值为 name的 HTML元素。

来源:HTML5规范,“对窗口对象的命名访问”, 重点是我的

基于此,遵循标准不是避免这种模式的原因。但是,该规范本身建议不要使用它:

通常,依靠它会导致代码变脆。例如,随着新功能添加到Web平台,最终映射到该API的ID会随时间变化。替代使用
document.getElementById()document.querySelector()

2020-04-25