Document
和Element
上都可以使用大多数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.0和1.7.0),看看是否使用getElementById
暗示了这可能是一个问题的原因。我看到getElementById
在某些较旧的浏览器中曾经是错误的,但是他们检测到了这一点,而是依靠可靠的手动实现。我看不到在元素上可能会调用它并导致错误的任何地方。这种兼容性问题来自哪里?
答案 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值在整个文档中必须唯一,因此不需要该函数的“本地”版本。
答案 2 :(得分:-4)
拥有所有唯一ID确实会让您的生活更轻松。