2010-07-26 22 views
13

Zarówno document.getElementsByTagName ("div"), jak i document.querySelectorAll ("div") zwracają kolekcję NodeList. Jedyna różnica polega na tym, że pierwsza metoda zwraca kolekcję na żywo, a druga - statyczną.Jak odróżnić kolekcje NodeList na żywo i nie na żywo?

Pytanie brzmi - czy istnieje możliwość odróżnienia jednego obiektu od drugiego tylko poprzez inspekcję tych obiektów (tj. - nie próbując dodawać/usuwać niektórych elementów w celu przetestowania "żywotności")?

góry dzięki

Odpowiedz

6

Interfejs NodeList jest agnostykiem od jego statusu martwego lub żywego.

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

Zawiera tylko właściwość length oraz metody item więc obawiam się, że w tej chwili nie jest możliwe ustalenie, czy dany przedmiot jest żyć bez manipulacji DOM i widząc efekty.

+0

Anurag, dziękuję za tą odpowiedź – shabunc

+0

jesteś mile widziany i bardzo ciekawe pytanie. Czy istnieje konkretny powód, dla którego chcesz sprawdzić * żywość * obiektu? Jeśli przyczyna jest dobra i rozwiązuje autentyczne problemy, może równie dobrze zaproponować ją autorom specyfikacji na stronie w3. – Anurag

+0

'document.querySelectorAll' zwraca' StaticNodeList', który z definicji nie jest "na żywo". Niezależnie od tego, czy nie można przeskanować 'NodeList', zastanawiam się, czy można bezpiecznie założyć' NodeList', zgodnie z konwencją, jest * zawsze * na żywo. –

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

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

(w FF/Chrome)

+1

to jest przypadkowe, nie ostateczne.' document.getElementsByName ("link"). toString() == "[obiekt NodeList]" 'i jest na żywo – chiliNUT