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

时间:2019-01-18 16:44:52

标签: javascript jquery dom compatibility specifications

DocumentElement上都可以使用大多数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生活标准tells us that

  

Web兼容性可防止getElementById()方法暴露在元素上

W3C DOM4建议is a bit more specific

  

getElementById()方法不在与旧版jQuery兼容的元素上。如果那个版本的jQuery消失的时候到了,我们也许可以支持它。

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

我尝试浏览jQuery的旧版本(例如1.0.01.7.0),看看是否使用getElementById暗示了这可能是一个问题的原因。我看到getElementById在某些较旧的浏览器中曾经是错误的,但是他们检测到了这一点,而是依靠可靠的手动实现。我看不到在元素上可能会调用它并导致错误的任何地方。这种兼容性问题来自哪里?

3 个答案:

答案 0 :(得分:13)

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

  

提交f71d7de304e1ee25573279157dd6ce1c2aa2c4f2
  作者:Anne van Kesteren
  作者日期:2013年11月26日星期二13:53:41 +0000
  提交:Anne van Kesteren
  提交日期:2013年11月26日星期二13:53:41 +0000

     

从Element中删除getElementById。 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假定它在DOM中找到的具有“ getElementById”属性的任何节点都是Document节点。参见https://bugzilla.mozilla.org/show_bug.cgi?id=933193#c17

答案 1 :(得分:3)

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

根据MDN's article on getElementById

  

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

getElementsByName

也是如此

答案 2 :(得分:-4)

拥有所有唯一ID确实会让您的生活更轻松。