Document#

Document.createNodeIterator()#

Metoda createNodeIterator() tworzy nowy obiekt typu NodeIterator (tzw. iterator węzłowy) z określonym korzeniem, maską bitową i filtrem dla danego dokumentu.

Opis działania#

Samo wywołanie i poszczególne jego części najlepiej objaśnić na zapisie składniowym:

  1. L
  2. K
  3. T'
  4. T
  5. A
  6. O
  7. Z'
  8. Z
  9. #
var new_iterator = document.createCreateNodeIterator(root [, whatToShow = 4294967295 [, filter = null]]);

gdzie poszczególne człony oznaczają:

Algorytm wywołania metody createNodeIterator(root, whatToShow, filter) nie jest skomplikowany. Dla lepszego zrozumienia tematu prezentuję go w całości:

  1. Niech iterator będzie nowym obiektem typu NodeIterator.
  2. Ustaw korzeń oraz zainicjuj atrybut referenceNode w iterator na wartość argumentu root.
  3. Zainicjuj atrybut pointerBeforeReferenceNode w iterator na boolowską wartość true.
  4. Ustaw maskę bitów w iterator na wartość argumentu whatToShow.
  5. Ustaw filtr w iterator na wartość argumentu filter.
  6. Zwróć iterator.

Korzeń, maska bitowa oraz filtr w iteratorach węzłowych są ustawiane jednorazowo za pośrednictwem metody createNodeIterator() i nigdy nie ulegają zmianie. W razie potrzeby zawsze istnieje możliwość utworzenia nowego iteratora węzłowego o określonych cechach.

Obiekt zwracany przez metodę createNodeIterator() implementuje interfejs NodeIterator, dlatego ma dostęp do wszystkich poleceń z tego interfejsu (oraz z kolejnych interfejsów w łańcuchu dziedziczenia).

Więcej szczegółów związanych z iteratorami węzłowymi umieściłem w zbiorczym dziale "Podstawy - Przejścia".

Prosty przykład:

  1. L
  2. K
  3. T'
  4. T
  5. A
  6. O
  7. Z'
  8. Z
  9. #
<script>

	// Tworzymy nowego iteratora węzłowego (maska bitowa oraz filtr są domyślne)
	var iterator1 = document.createNodeIterator(document);

	document.write(iterator1); // [object NodeIterator]
	document.write("<br>");
	document.write(iterator1.root); // [object HTMLDocument]
	document.write("<br>");
	document.write(iterator1.whatToShow); // 4294967295
	document.write("<br>");
	document.write(iterator1.filter); // null

	document.write("<br><br>");

	// Tworzymy nowego iteratora węzłowego z własną maską bitową i filtrem
	var iterator2 = document.createNodeIterator(document.documentElement, 1, function(node){

		if (node.nodeName.toLowerCase() == "p"){
			return 1;
		}

	});

	document.write(iterator2); // [object NodeIterator]
	document.write("<br>");
	document.write(iterator2.root); // [object HTMLHtmlElement]
	document.write("<br>");
	document.write(iterator2.whatToShow); // 1
	document.write("<br>");
	document.write(iterator2.filter); // function (node){ if (node.nodeName.toLowerCase() == "p"){ return 1; } },
									  // [object NodeFilter] w Chrome (błędnie)

</script>

Na chwilę obecną jedynie przeglądarka Firefox obsługuje metodę createNodeIterator() zgodnie z najnowszymi wymaganiami specyfikacji DOM4. Chrome błędnie zwraca funkcję filtrującą poprzez właściwość NodeIterator.filter. Opera (Presto) i IE11 spełniają wymagania poprzedniej specyfikacji, gdzie wywołanie metody createNodeIterator() wymagało przekazania czterech argumentów (żaden nie był opcjonalny).

W poprzedniej specyfikacji metoda createNodeIterator() definiowana była w specjalnym interfejsie DocumentTraversal, ale z dopiskiem, że może być implementowana bezpośrednio w interfejsie Document.

Składnia Web IDL#

  1. L
  2. K
  3. T'
  4. T
  5. A
  6. O
  7. Z'
  8. Z
  9. #
interface Document : Node {
	[NewObject] NodeIterator createNodeIterator(Node root, optional unsigned long whatToShow = 0xFFFFFFFF, optional NodeFilter? filter = null);
};

Specyfikacje i inne materiały#

Pasek społecznościowy

SPIS TREŚCI AKTUALNEJ STRONY

Document (H1) Document.createNodeIterator() (H2) Opis działania (H3) Składnia Web IDL (H3) Specyfikacje i inne materiały (H3)