Как отличить живые и неживые коллекции NodeList?

И document.getElementsByTagName('div'), и document.querySelectorAll('div') возвращают коллекцию NodeList. Разница лишь в том, что первый метод возвращает живую коллекцию, а второй — статическую.

Вопрос - есть ли возможность отличить один объект от другого только путем осмотра этих объектов (т.е. не пытаться добавить/убрать какие-то элементы для проверки "живости")?

заранее спасибо


person shabunc    schedule 26.07.2010    source источник


Ответы (2)


Интерфейс NodeList не зависит от его мертвого или живого статуса.

interface NodeList {
  Node item(in unsigned long index);
  readonly attribute unsigned long length;
};

Он содержит только свойство length и метод item, поэтому я боюсь, что в настоящее время невозможно определить, является ли объект живым, не манипулируя DOM и не видя эффектов.

person Anurag    schedule 27.07.2010
comment
Пожалуйста, и очень интересный вопрос. Есть ли конкретная причина, по которой вы хотите проверить живость объекта? Если причина веская и решает настоящие проблемы, можно предложить ее авторам спецификации на w3. - person Anurag; 27.07.2010
comment
document.querySelectorAll возвращает StaticNodeList, который по определению не является активным. Несмотря на то, что я не могу допросить NodeList, интересно, безопасно ли предположить, что NodeList по соглашению всегда жив. - person Crescent Fresh; 28.07.2010
comment
@Crescent - я не нашел упоминания о StaticNodeList в Selectors API уровень 2 или в уровень 1, но упоминается только в черновик уровня 1. - person Anurag; 28.07.2010
comment
@ Анураг: ты прав. Он появился только 7 декабря (w3.org/TR/2007). /WD-selectors-api-20071221), но похоже, что он был заменен на NodeList в качестве возвращаемого типа. - person Crescent Fresh; 28.07.2010
comment
Тем не менее, в последней версии указано, что объект NodeList, возвращаемый функцией querySelectorAll() метод должен быть статическим, а не живым, что странно, поскольку NodeList сам по себе определен как живой. - person user123444555621; 28.07.2010
comment
@Crescent — например, в WebKit — document.querySelectorAll('div') instanceof NodeList имеет значение true, а попытка заменить NodeList на StaticNodeList вызовет ошибку — ReferenceError: Can't find variable: StaticNodeList - person shabunc; 29.07.2010
comment
@Anurag - ну, на самом деле у меня нет никакой практической причины, но я верю, что такие основные свойства можно проверить - person shabunc; 29.07.2010
comment
@shabunc: да, это было бы свидетельством того, что StaticNodeList больше нет :( Однако обратите внимание, что среда хоста (например, браузер) не требуется (по спецификации) для предоставления каких-либо типов верхнего уровня в пределах глобальная область видимости.Например, не обязательно, чтобы NodeList было действительным именем в браузере! - person Crescent Fresh; 29.07.2010

a=document.querySelectorAll('a');
b=document.getElementsByTagName('a');

a.toString() == "[object NodeList]"
b.toString() == "[object HTMLCollection]"

(в FF/Chrome)

person s79    schedule 11.03.2011
comment
это случайно, а не окончательно. document.getElementsByName('link').toString() == "[object NodeList]" и он в прямом эфире - person chiliNUT; 27.01.2015