代码之家  ›  专栏  ›  技术社区  ›  Jeremy Meo

为什么getElementByID()在元素上不可用?

  •  -1
  • Jeremy Meo  · 技术社区  · 6 年前

    大多数dom查询方法都可用于 Document S和 Element 例如,

    console.assert(
      document.getElementsByTagName   && document.body.getElementsByTagName &&
      document.getElementsByClassName && document.body.getElementsByClassName &&
      document.querySelector          && document.body.querySelector &&
      document.querySelectorAll       && document.body.querySelectorAll
    );
    

    然而, getElementById 仅在上可用 文件 :

    console.assert(document.getElementById);
    console.assert(document.body.getElementById == undefined);
    

    为什么会这样?


    什么样的生活水平 tells us that :

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

    W3C DOM4建议 is a bit more specific :

    这个 GetElementByID()。 方法不在元素上,因此与旧版本的jquery不兼容。如果jquery版本消失的时候到来,我们可能能够支持它。

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

    我试过查看jquery的旧版本(例如 1.0.0 1.7.0 )看看他们有没有使用 GETeleMyByID 暗示这可能是个问题的原因。我明白了 GETeleMyByID 以前在一些老版本的浏览器中是有缺陷的,但是它们检测到了这一点,并返回到可靠的手动实现中。我看不到任何地方可以在元素上调用它并导致bug。这种兼容性问题来自哪里?

    2 回复  |  直到 6 年前
        1
  •  4
  •   Jeremy Meo    6 年前

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

    犯罪 f71d7de304e1ee25573279157dd6ce1c2aa2c4f2
    作者:安妮·范·凯斯特伦
    作者日期:11月26日星期二13:53:41 2013+0000
    提交:anne van Kesteren<annevk@annevk.nl>
    委员会日期:2013年11月26日星期二13:53:41+0000

    从元素中移除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”属性的任何节点都是文档节点。见 https://bugzilla.mozilla.org/show_bug.cgi?id=933193#c17

        2
  •  1
  •   James Long    6 年前

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

    根据 MDN's article on getElementById :

    因为ID值在整个文档中必须是唯一的,所以不需要函数的“本地”版本。

    同样的道理也适用于 getElementsByName