为什么不';难道我们不能在JavaScript中使用元素ID作为标识符吗?

为什么不';难道我们不能在JavaScript中使用元素ID作为标识符吗?,javascript,dom,getelementbyid,Javascript,Dom,Getelementbyid,我使用的所有浏览器都允许通过编写以下内容访问具有id=“myDiv”的元素: myDiv 请看这里: 无论如何,这种方法似乎没有很好的文档记录,事实上,我遇到的资料甚至没有提到它,而是假设人们会使用它 document.getElementById("myDiv") 或许 document.querySelector("#myDiv") 访问DOM元素,即使其ID事先已知(即在运行时未计算)。我可以看出,如果有人无意中试图在更大的范围内重新定义myDiv(虽然这不是一个好主意…),用不同的

我使用的所有浏览器都允许通过编写以下内容访问具有
id=“myDiv”
的元素:

myDiv
请看这里:

无论如何,这种方法似乎没有很好的文档记录,事实上,我遇到的资料甚至没有提到它,而是假设人们会使用它

document.getElementById("myDiv")
或许

document.querySelector("#myDiv")
访问DOM元素,即使其ID事先已知(即在运行时未计算)。我可以看出,如果有人无意中试图在更大的范围内重新定义
myDiv
(虽然这不是一个好主意…),用不同的值覆盖它,并且在没有注意到冲突的情况下继续,那么后一种方法的优点是保持代码安全

但是其他的呢?除了代码设计之外,在使用上面的简短形式时是否还有其他问题,或者我在这里遗漏了什么

无论如何,这种方法似乎没有很好的文档记录,事实上,我遇到的资料甚至没有提到它[…]

撇开对隐式声明的全局变量的依赖不谈,缺少文档是不使用它的一个重要原因

id
值明显提升为全局变量是不符合标准的(没有提及),因此,您不应该假设未来的浏览器将实现它

编辑:事实证明这种行为符合标准-在HTML5中,
window
应该支持对“命名元素”的属性访问:

出于上述算法的目的,具有名称的命名对象是:

  • 名称为name的活动文档的子浏览上下文
  • a、 小程序、区域、嵌入、表单、框架集、img或具有 值为名称的名称内容属性,或
  • 具有值为name的id-content属性的HTML元素。
资料来源:我的重点

基于此,遵守标准并不是避免这种模式的理由。但是,规范本身建议不要使用:

一般来说,依赖这一点会导致代码脆弱。哪个 随着新特性的增加,最终映射到此API的ID可能会随着时间的推移而变化 例如,添加到Web平台。使用
document.getElementById()
document.querySelector()

无论如何,这种方法似乎没有很好的文档记录,事实上,我遇到的资料甚至没有提到它[…]

撇开对隐式声明的全局变量的依赖不谈,缺少文档是不使用它的一个重要原因

id
值明显提升为全局变量是不符合标准的(没有提及),因此,您不应该假设未来的浏览器将实现它

编辑:事实证明这种行为符合标准-在HTML5中,
window
应该支持对“命名元素”的属性访问:

出于上述算法的目的,具有名称的命名对象是:

  • 名称为name的活动文档的子浏览上下文
  • a、 小程序、区域、嵌入、表单、框架集、img或具有 值为名称的名称内容属性,或
  • 具有值为name的id-content属性的HTML元素。
资料来源:我的重点

基于此,遵守标准并不是避免这种模式的理由。但是,规范本身建议不要使用:

一般来说,依赖这一点会导致代码脆弱。哪个 随着新特性的增加,最终映射到此API的ID可能会随着时间的推移而变化 例如,添加到Web平台。使用
document.getElementById()
document.querySelector()


有几个原因:

您不希望代码和标记耦合在一起

通过使用特定的调用访问div,您不必担心全局空间被破坏。添加一个在全局空间中声明
myDiv
的库,您将陷入一个难以修复的痛苦世界

您可以通过ID访问不属于DOM的元素

它们可以位于片段、框架或已分离但尚未重新连接到DOM的元素中

编辑:通过
ID

var frag=document.createDocumentFragment();
var span=document.createElement(“span”);
span.id=“span测试”;
附件碎片(span);
var span2=框架getElementById(“跨度测试”);

警报(span==span2)有几个原因:

您不希望代码和标记耦合在一起

通过使用特定的调用访问div,您不必担心全局空间被破坏。添加一个在全局空间中声明
myDiv
的库,您将陷入一个难以修复的痛苦世界

您可以通过ID访问不属于DOM的元素

它们可以位于片段、框架或已分离但尚未重新连接到DOM的元素中

编辑:通过
ID

var frag=document.createDocumentFragment();
var span=document.createElement(“span”);
span.id=“span测试”;
附件碎片(span);
var span2=框架getElementById(“跨度测试”);

警报(span==span2)好问题。爱因斯坦可能没有说过,事情应该尽可能简单,而不是简单

如果有人无意中试图在更大的范围内重新定义myDiv(虽然这不是一个好主意……),用一些不同的值覆盖myDiv,并且在没有注意到冲突的情况下继续,则后一种方法的优点是保持代码安全

这是主要原因