问题 为什么不需要document.getElementById? [重复]


这个问题在这里已有答案:


2232
2017-09-19 10:28


起源

的jsfiddle: jsfiddle.net/feeela/2zr5Lgfo - feeela
当网页中需要很多这样的元素时,存储所有内容可能不是一个好主意。 - Alok Swain


答案:


以下示例在不使用“document.getElementById('myId')”的情况下工作。为什么这样,可以跳过“document.getElementById('myId')”?

因为浏览器会转储对所有元素的引用 id进入全局命名空间,使用 id 作为变量名称。 (从技术上讲,作为 属性 全局对象上的名称;全局对象的属性是全局变量。)我强烈建议  依靠它并使用 document.getElementById (或类似的)代替。全局命名空间是 真的很拥挤 还有很多其他可能会发生冲突的事情。

例如,如果你有

<div id="foo">...</div>

function foo() {
}

然后只是使用 foo 在你的代码中将为您提供函数,而不是元素。

同样,如果你有

<input type="text" id="name">

......并使用 name 在你的代码中,你将获得窗口的名称(一个字符串),而不是 HTMLInputElement 为您 id="name" 领域。

将对元素的引用转储到全局命名空间的业务包括在内 HTML5规范的§5.2.4在这种情况下,很大程度上记录了浏览器长期以来所做的事情。

如果我不将ID存储在变量中,或者它是如何变量的,那么它是否会更多DOM遍历?

它已经是上面的全局变量,所以没有额外的DOM遍历。在深度嵌套的函数中,可能会有更多的范围链遍历,但这不太可能是一个主要问题。


但是,我强烈建议  依靠自动元素全局变量。相反,将代码包装在作用域函数中(如您所示),并有意地获取元素 getElementByIdquerySelectorquerySelectorAll等等,视情况而定。如果你依赖自动全局变量,最终你会被冲突所困扰。但这是意见。

请注意查找元素 getElementById 是 真的很快,因此出于性能原因通常不需要缓存引用(您可能希望出于其他原因这样做,例如编码方便)。用选择器查找(querySelectorquerySelectorAll)有点慢,但是如果出现问题,我会担心它。 :-)


10
2017-09-19 10:34



我对如何编写ID和函数有一个特殊的模式。就我而言,不存在冲突。此外,我永远不会与其他程序员分享我的代码。如果所有现代浏览器都支持该技术并且他们正在计划继续这样做,我认为没有理由不尝试它。但是,非常感谢你的回答! - user1087110
几个星期前我偶然发现了这种技术,从那时起就一直在使用它。它适用于所有浏览器,包括移动浏览器。 - BlackMagic