为什么Elements上没有getElementById()方法可用?

6
大多数DOM查询方法都适用于文档和元素。例如,
console.assert(
  document.getElementsByTagName   && document.body.getElementsByTagName &&
  document.getElementsByClassName && document.body.getElementsByClassName &&
  document.querySelector          && document.body.querySelector &&
  document.querySelectorAll       && document.body.querySelectorAll
);

然而,getElementById 仅在 Document 上可用:

console.assert(document.getElementById);
console.assert(document.body.getElementById == undefined);

为什么会这样?

WHATWG DOM Living Standard 告诉我们

为了保持网页兼容性,元素上不会暴露 getElementById() 方法。

W3C DOM4 Recommendation 更具体地说明

为了与旧版本的 jQuery 兼容,元素上没有 getElementById() 方法。如果那个版本的 jQuery 消失了,我们可能会支持它。

然而,我仍然很难理解问题所在。这些方法的存在如何对 jQuery 或其他库的行为产生负面影响?

我尝试查看旧版本的jQuery(例如1.0.01.7.0),以查看它们对getElementById的使用是否暗示了为什么会出现问题。我发现在一些旧浏览器中getElementById曾经存在缺陷,但是它们检测到这一点并回退到可靠的手动实现。我没有看到它可能被调用并导致错误的任何地方。这个兼容性问题来自哪里?

4
因为 id 值必须在整个文档中保持唯一,所以做这件事情有什么意义呢? - Pointy
1
可能只有一个元素,但如果它存在于文档的特定子树中,我可能只对它感兴趣。 - Jeremy
1
@Pointy,我已经引用了两个规格的兼容性问题,所以告诉我这是无意义的似乎是不正确的。 - Jeremy
2
我不知道为什么旧版本的jQuery会引起规范委员会的关注。 - Pointy
2
@Pointy:因为引入Element#getElementById会破坏使用该版本jQuery的现有网站,很明显至少在2013年被广泛部署。 - Ry-
显示剩余2条评论
3个回答

13

git blamehttps://github.com/w3c/dom 的主分支指向:

提交记录 f71d7de304e1ee25573279157dd6ce1c2aa2c4f2
作者:Anne van Kesteren
作者提交时间:Tue Nov 26 13:53:41 2013 +0000
提交者:Anne van Kesteren <annevk@annevk.nl>
提交时间:Tue Nov 26 13:53:41 2013 +0000

移除了 Element 中的 getElementById。 https://www.w3.org/Bugs/Public/show_bug.cgi?id=23860

而链接的 bug 描述了 jQuery 1.2.5 + 1.2.6 (1.2.x?) 受到影响:

jQuery 1.2.5 假设在 DOM 中找到的任何具有“getElementById”属性的节点都是文档节点。请参阅 https://bugzilla.mozilla.org/show_bug.cgi?id=933193#c17


1
Jquery应该有其他方法来检查对象是否为文档节点。 - Raymond
1
@RaymondPeng:现在已经解决了,但是网站并不都会升级。当流行的软件出现错误时,错误会持续很长时间。 - Ry-

3
正如其他评论中所说,元素ID应该是唯一的。因此,在元素上没有必要有一个getElementById方法。
根据MDN关于getElementById的文章
“由于ID值必须在整个文档中是唯一的,因此不需要“本地”版本的函数。”
对于getElementsByName也是同样的道理。

但是 getElementsByName 只能在 document 上使用,而不能在元素上使用。我相信最初的意图是名称是唯一的,并且现在我们使用 ID 的方式。这可以解释一些旧版本 jQuery 解决的浏览器错误。 - James Long

-4

确保所有的ID都是唯一的,这将使您的生活更加轻松。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接