为什么 getElementById() 在 Elements 上不可用?

Why isn't getElementById() available on Elements?

大多数 DOM 查询方法在 DocumentElement 上都可用。例如,

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 生活水平 tells us that:

Web compatibility prevents the getElementById() method from being exposed on elements

W3C DOM4 推荐is a bit more specific:

The getElementById() method is not on elements for compatibility with older versions of jQuery. If a time comes where that version of jQuery has disappeared, we might be able to support it.

但是,我仍然很难理解可能是什么问题。这种方法的存在如何对 jQuery 或其他库的行为产生不利影响?

我尝试查看旧版本的 jQuery(例如 1.0.0 and 1.7.0),看看他们对 getElementById 的使用是否暗示了为什么这可能是一个问题.我看到 getElementById 曾经在一些旧浏览器中存在错误,但他们检测到这一点并转而回退到可靠的手动实现。我看不到任何可以在元素上调用它并导致错误的地方。这种兼容性问题从何而来?

正如其他人在评论中所说,元素 ID 应该是唯一的。不需要在元素上使用 getElementById 方法。

根据MDN's article on getElementById

Because ID values must be unique throughout the entire document, there is no need for "local" versions of the function.

getElementsByName也是如此

https://github.com/w3c/dom 的 master 分支上的 git blame 指向:

commit f71d7de304e1ee25573279157dd6ce1c2aa2c4f2
Author: Anne van Kesteren
AuthorDate: Tue Nov 26 13:53:41 2013 +0000
Commit: Anne van Kesteren <annevk@annevk.nl>
CommitDate: Tue Nov 26 13:53:41 2013 +0000

Remove getElementById from Element. https://www.w3.org/Bugs/Public/show_bug.cgi?id=23860

并且链接的错误描述了 jQuery 1.2.5 + 1.2.6 (1.2.x?) 是如何受到影响的:

jQuery 1.2.5 assumes that any node it found in the DOM that has a "getElementById" property is a Document node. See https://bugzilla.mozilla.org/show_bug.cgi?id=933193#c17

让您的所有 ID 都独一无二会让您的生活更轻松。