为什么不在JavaScript中使用元素ID作为标识符?

所有使用过的浏览器都允许访问id="myDiv"的元素,只需编写以下代码:

 myDiv 

看到这里: http : //jsfiddle.net/L91q54Lt/

无论如何,这种方法似乎是相当不完善的logging,事实上,我遇到的来源甚至没有提及它,而是假设一个会使用

 document.getElementById("myDiv") 

或者可能

 document.querySelector("#myDiv") 

甚至在事先知道其ID(即,不在运行时计算)的情况下访问DOM元素。 我可以说,后一种方法的优点在于,如果有人无意尝试在更广的范围内重新定义myDiv (虽然不是这样一个绝妙的主意),但它会用一些不同的值覆盖它,继续进行,而不会注意到冲突。

但是那个呢? 除了代码devise之外,使用简写forms还有什么问题吗?还有什么我在这里丢失的?

无论如何,这种方法似乎是相当不好的logging,而事实上,我遇到的来源甚至没有提及它[…]

除了隐式声明的全局variables之外,缺less文档是不使用它的一个很好的理由。

id值明显提升为全局variables不符合标准( ID属性的HTML5规范没有提及它),因此,您不应该假设未来的浏览器将实现它。

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

为了上述algorithm的目的,具有名称的命名对象是那些是:

  • 名称为名称的活动文档的子浏览上下文,
  • a,小程序,区域,embedded,表单,框架集,img或具有名称内容属性(其值为名称)的对象元素,或者
  • 具有值名称id内容属性的HTML元素。

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

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

一般来说,依靠这个会导致代码变得脆弱。 例如,随着新function被添加到Web平台,哪些ID最终映射到此API可能会随时间而变化。 而不是使用document.getElementById()document.querySelector()

伟大的问题。 正如爱因斯坦可能没有说过的那样,事情应该尽可能简单,而不是简单。

后一种方法的好处是保持代码安全,如果有人无意尝试在更广的范围内重新定义myDiv(虽然不是这样一个好主意),用一些不同的价值覆盖它,继续而不会注意到冲突

这就是为什么这是一个坏主意的主要原因,这是相当的。 全局variables是不安全的依靠。 他们可以随时被覆盖,通过任何结束在页面上运行的脚本。

除此之外,只需inputmyDiv不是document.getElementById()的“简短forms”。 这是对全局variables的引用。 如果元素不存在, document.getElementById()将愉快地返回null ,而试图访问一个不存在的全局variables将抛出一个引用错误,所以你需要在try / catch块是安全的。

这就是为什么jQuery如此受欢迎的一个原因:如果你做$("#myDiv").remove() ,并且没有元素的id为myDiv ,那么不会抛出任何错误 – 代码只会默默无闻,这通常正是你在做DOM操作时所需要的。

有几个原因:

你不希望你的代码和你的标记相结合。

通过使用特定的电话访问一个div,你不必担心全球空间被破坏。 添加一个在全局空间中声明myDiv的库,并且你处于一个难以解决的痛苦世界。

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

它们可以在一个片段,一个框架或一个已经分离的元素中,而不是重新连接到DOM。

编辑:通过ID访问非附加元素的示例

 var frag = document.createDocumentFragment(); var span = document.createElement("span"); span.id = "span-test"; frag.appendChild(span); var span2 = frag.getElementById("span-test"); alert(span === span2);