getElementsByTagName работает, но getElementById не работает?

Я занимаюсь разбором XML и сталкиваюсь со странной проблемой. Метод getElementsByTagName из элемента DOM работает, а метод getElementById — нет. Chrome выдает эту ошибку везде, где я вызываю getElementById для манифеста:

Object #<Element> has no method 'getElementById'

Но каким-то образом getElementByTagName работает просто отлично.

var manifest = content.getElementsByTagName("manifest")[0];
var spine = content.getElementsByTagName("spine")[0];
var itemref = spine.getElementsByTagName("itemref")[0].getAttribute("idref");
alert(itemref);//works
var firstpage = manifest.getElementById(itemref).getAttribite("href");

Может ли кто-нибудь объяснить мне, почему у меня не работает getElementById DOM?

test = manifest.getElementById("any value");//Problem
test = manifest.getElementsByTagName("any value");//no Problem

person Eduan Bekker    schedule 08.04.2013    source источник


Ответы (3)


Вы не можете вызывать getElementById как метод произвольных элементов, он доступен только для элемента document. Это имеет смысл, поскольку в HTML-документе не должно быть повторяющихся идентификаторов.

При этом ваш вызов getElementById("a") выглядит странно; у вас действительно есть элемент с id="a", или вы пытаетесь получить ссылку на произвольный якорь?

person bfavaretto    schedule 08.04.2013
comment
Прошу прощения за расплывчатость. getElementById(a) должно было быть getElementById(любое значение), потому что это было просто для того, чтобы объяснить, что getElementById не работает, а getElementsByTagName работает. Для этого мне придется написать собственную функцию getElementById. Я обрабатываю сложный файл XML с помощью парсера DOM. - person Eduan Bekker; 08.04.2013
comment
Итак, вам нужно будет разместить дубликаты идентификаторов, в этом проблема? - person bfavaretto; 08.04.2013
comment
Нет, в XML нет повторяющихся идентификаторов, поэтому я хотел использовать getElementById, но не знал, что он не является частью DOMElement, поэтому мне придется написать свой собственный. - person Eduan Bekker; 08.04.2013
comment
Я не понимаю, почему, поскольку он должен быть доступен в корневом элементе XML (не так ли?) - person bfavaretto; 08.04.2013
comment
В соответствии с этим это не так:DOMElement - person Eduan Bekker; 08.04.2013
comment
Вы правы (или, по крайней мере, когда-то это было проблемой в Firefox). Это должно помочь: stackoverflow.com/a/3667520/825789 - person bfavaretto; 08.04.2013

getElementById ищет уникальный идентификатор элемента, а не его тип. Таким образом, если ваш тег выглядит следующим образом, он будет работать для обоих сценариев:

<a id="a">
person David L    schedule 08.04.2013
comment
Извините, но вы неправильно поняли мой вопрос. Контент представляет собой сложный файл XML, а не HTML с тегами ‹a›. Я не знал, что getElementById принадлежит только объекту документа, но getElementsByTagName любому объекту DOM Parser, как указано bfavaretto. - person Eduan Bekker; 08.04.2013

getElementById — это функция document объект. DOMElement не имеет этого метода.

person fernandosavio    schedule 08.04.2013