为什么不在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);