大多数DOM查询方法都可以在Document
s和Element
s上使用。例如,
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.0和1.7.0),看看他们是否使用getElementById
暗示为什么这可能是一个问题。我看到getElementById
曾经在一些旧版浏览器中出现问题,但他们检测到这种情况并转而使用可靠的手动实现。我没有看到任何可以在元素上调用它并导致错误的地方。这种兼容性问题来自哪里?
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
正如其他人在评论中所说,元素ID应该是唯一的。没有必要在元素上使用getElementById
方法。
据MDN's article on getElementById
说:
由于ID值在整个文档中必须是唯一的,因此不需要该函数的“本地”版本。
让您所有的ID独一无二将真正让您的生活更轻松。