为什么元素上没有getElementById()?

问题描述 投票:6回答:3

大多数DOM查询方法都可以在Documents和Elements上使用。例如,

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兼容性可防止getElementById()方法暴露在元素上

W3C DOM4推荐标准is a bit more specific

getElementById()方法不是与旧版jQuery兼容的元素。如果时间到了那个版本的jQuery消失了,我们也许能够支持它。

但是,我仍然很难理解问题所在。这种方法的存在怎么会对jQuery或其他库的行为产生负面影响?

我已经尝试查看旧版本的jQuery(例如1.0.01.7.0),看看他们是否使用getElementById暗示为什么这可能是一个问题。我看到getElementById曾经在一些旧版浏览器中出现问题,但他们检测到这种情况并转而使用可靠的手动实现。我没有看到任何可以在元素上调用它并导致错误的地方。这种兼容性问题来自哪里?

javascript jquery dom compatibility specifications
3个回答
13
投票

git blame主分支上的https://github.com/w3c/dom指出:

承诺f71d7de304e1ee25573279157dd6ce1c2aa2c4f2 作者:Anne van Kesteren 作者日期:Tue Nov 26 13:53:41 2013 +0000 承诺:Anne van Kesteren <[email protected]> 提交日期: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”属性的任何节点都是Document节点。见https://bugzilla.mozilla.org/show_bug.cgi?id=933193#c17


3
投票

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

MDN's article on getElementById说:

由于ID值在整个文档中必须是唯一的,因此不需要该函数的“本地”版本。

getElementsByName也是如此


-4
投票

让您所有的ID独一无二将真正让您的生活更轻松。

© www.soinside.com 2019 - 2024. All rights reserved.