2012-10-27 24 views
7

Zastanawiam się nad tym tematem od dłuższego czasu. Metody o których mowa, są następujące:Jak niezawodny jest "porządek" w zapytaniach NodeLists

  • getElementsByTagName
  • getElementsByClassName
  • getElementsByName
  • querySelectorAll

O ile mi wiadomo, te metody DOM są jedynymi metodami, które są w stanie powrócić zamrożone lub żyć NodeLists. W przypadku niektórych z tych metod zamówienie jest zdefiniowane przez W3C spec. Na przykład, http://www.w3.org zapisuje następujące informacje dotyczące NodeLists zwrócony przez querySelectorAll

The querySelectorAll() metod dotyczących dokumentu interfejsy DocumentFragment i element musi powrócić na liście węzłów zawierający wszystkie odpowiadających węzłów Element ciągu poddrzewach Spośród węzeł kontekstowy, w porządku dokumentu . Jeśli nie ma pasujących węzłów, metoda musi zwrócić pustą listę NodeList.

Jednak nie mogę znaleźć podobne jasne specyfikacji dla innych metod, o których wspomniałem. Moje pytania są tu:

  • istnieje określona kolejność (najprawdopodobniej zamówienie dokument) dla wyników?
  • jak niezawodne i zaimplementowane w przeglądarce są te specyfikacje?

Aby mieć absolutną jasne:

<div>this</div> 
<div>is</div> 
<div>a demo</div> 

// is this always guaranteed to be "<div>is</div>" 
document.querySelectorAll('div')[1] 
+0

+1, bardzo interesujące pytanie. – saji89

+2

Niezależnie od tego, czy/jak jest zdefiniowane w specyfikacji, wyobraź sobie, że nie ma gwarantowanej kolejności. Indeksowane odniesienia nie miałyby znaczenia, zostałyby porzucone dawno temu, a każdy rekursywnie przechodziłby przez wszystkie 'childNodes' w DOM, gdy potrzebna jest gwarancja indeksowania. Nie widziałem nic, co wskazywałoby na jakąkolwiek zmianę WRT w kolejności wyników. –

+0

... odmiana *, która * zwraca elementy, to inna historia. –

Odpowiedz

4

Tak. Wszystkie są uporządkowane według porządku/drzewa.

  • getElementsByName (DOM Level-2-HTML) zwraca NodeList
  • querySelectorAll (Selectors API) zwraca NodeList "w kolejności dokumentu"
  • getElementsByTagName (DOM) zwraca HTMLCollection
  • getElementsByClassName (DOM) zwraca HTMLCollection

HTMLCollections i NodeLists oba podane mieć

elementy są sortowane w tree order.

kiedy dostęp do nich uzyskuje się za pomocą indizes.

Myślę, że te specyfikacje (mimo że połączone wersje mogą być nowsze niż niektóre implementacje) są niezawodnie wdrażane przez wszystkie przeglądarki, głównie dlatego, że kolejność drzew jest najbardziej logiczna i łatwa do skatalogowania. Jednak może być konieczne, aby zwrócić uwagę, że niektóre przeglądarki mogą zwracać listy składające się z różnych elementów, ponieważ ich dopasowanie węzłów różni się. Mogłem wymyślić jakieś dziwactwa przy określaniu elementu name.

+0

, tak to właśnie powinno być "powinno być". A co z implementacjami realworld? Muszę wiedzieć, jak niezawodnie jest to w szerokim zakresie przeglądarek i wersji (na urządzenia mobilne i stacjonarne). –

+0

Nie mam statystyk i mogę tylko zgadywać, ale nigdy nie słyszałem o różnych przeglądarkach. Największe z pewnością to poprawią. – Bergi

+0

Dla jakiego algorytmu musisz znać prawidłową kolejność, btw? – Bergi