Почему getElementById () недоступен в Elements? - PullRequest
0 голосов
/ 18 января 2019

Большинство методов запроса 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 говорит нам, что :

Веб-совместимость предотвращает использование метода getElementById() для элементов

Рекомендация W3C DOM4 немного конкретнее :

Метод getElementById() не предназначен для элементов для совместимости со старыми версиями jQuery. Если придет время, когда эта версия jQuery исчезнет, ​​мы сможем ее поддержать.

Однако мне все еще трудно понять, в чем проблема. Как присутствие этих методов может отрицательно повлиять на поведение jQuery или других библиотек?

Я пытался просмотреть старые версии jQuery (например, 1.0.0 и 1.7.0 ), чтобы увидеть, намекает ли их использование getElementById, почему это могло быть проблемой. Я вижу, что getElementById имел обыкновение глючить в некоторых старых браузерах, но они обнаруживают это и вместо этого прибегают к надежной ручной реализации. Я не вижу нигде, чтобы это могло быть вызвано на элементе и вызвать ошибку. Откуда эта проблема совместимости?

Ответы [ 3 ]

0 голосов
/ 18 января 2019

Основная ветвь git blame на https://github.com/w3c/dom’s указывает на:

commit f71d7de304e1ee25573279157dd6ce1c2aa2c4f2
Автор: Анна ван Кестерен
AuthorDate: вт 26 ноября 13:53:41 2013 + 0000
Фиксация: Энн ван Кестерен
CommitDate: вт 26 ноября 13:53:41 2013 +0000

Удалить 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

0 голосов
/ 03 апреля 2019

Наличие всех ваших уникальных идентификаторов действительно облегчит вашу жизнь.

0 голосов
/ 18 января 2019

Как уже говорили другие в комментариях, идентификаторы элементов должны быть уникальными. Не было бы необходимости иметь метод getElementById для элемента.

Согласно статье MDN getElementById:

Поскольку значения идентификаторов должны быть уникальными во всем документе, нет необходимости в «локальных» версиях функции.

То же самое относится и к getElementsByName

...