TreeWalker#

TreeWalker.previousNode()#

Metoda previousNode() zwraca węzeł poprzedzający względem bieżącego węzła w danym przemierzaczu drzewa, który spełnia kryteria filtracji. Jeśli nie będzie takiego węzła to zwrócona zostanie wartość null.

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 previous_node = treeWalker.previousNode();

gdzie poszczególne człony oznaczają:

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

  1. Niech node będzie wartością wskazywaną przez atrybut currentNode w obiekcie kontekstu.
  2. Dopóki (while) node nie jest korzeniem skojarzonym z obiektem kontekstu, to uruchom poniższe podkroki:

    1. Niech sibling będzie bratem poprzedzającym względem node.
    2. Dopóki (while) sibling nie ma wartości null, to uruchom wewnętrzne podkroki:

      1. Ustaw node na sibling.
      2. Przefiltruj node i niech result będzie zwracaną wartością.
      3. Dopóki (while) result nie ma wartości FILTER_REJECT i node ma dziecko, to ustaw node na swoje ostatnie dziecko, następnie przefiltruj node i ustaw result na zwracaną wartość.
      4. Jeśli result ma wartość FILTER_ACCEPT, to ustaw atrybut currentNode w obiekcie kontekstu na node i zwróć node.
      5. Ustaw sibling na brata poprzedzającego względem node.
    3. Jeśli node jest korzeniem skojarzonym z obiektem kontekstu lub rodzicem w node jest wartość null, to zwróć wartość null.
    4. Ustaw node na swojego rodzica.
    5. Przefiltruj node i jeśli zwracaną wartością będzie FILTER_ACCEPT, to ustaw atrybut currentNode w obiekcie kontekstu na node i zwróć node.
  3. Zwróć wartość null.

Metoda previousNode() pozwala na jednokrotne przetestowanie i ewentualne zwrócenie korzenia (kiedy bieżącym węzłem był jeden z jego potomków), każde kolejne wywołanie metody na korzeniu zwróci wartość null. Dzieje się tak dlatego, że bieżącym węzłem zostaje korzeń, który jest ogranicznikiem, dlatego nie można go opuścić w standardowy sposób. Teoretyczny opis tego procesu omówiłem w podstawach przemierzacza drzewa.

Prosty przykład:

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

<head>

	<script>

		function move(direct){

			var info1 = document.getElementById("info1");
			var info2 = document.getElementById("info2");
			var root = document.getElementById("box");
			var dir = "";
			var node = "";
			var nodeText = "";

			if (typeof walker != "object"){

				walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, null);

			}

			if (info1.textContent == ""){

				info1.innerHTML = "root: " + walker.root
					+ "<br>" + "currentNode: " + walker.currentNode
					+ "<br>" + "currentNode.textContent: " + walker.currentNode.textContent;

			}

			if (direct == "parentNode"){
				node = walker.parentNode();
				dir = "parentNode()";
			}

			if (direct == "firstChild"){
				node = walker.firstChild();
				dir = "firstChild()";
			}

			if (direct == "lastChild"){
				node = walker.lastChild();
				dir = "lastChild()";
			}

			if (direct == "nextSibling"){
				node = walker.nextSibling();
				dir = "nextSibling()";
			}

			if (direct == "previousSibling"){
				node = walker.previousSibling();
				dir = "previousSibling()";
			}

			if (direct == "nextNode"){
				node = walker.nextNode();
				dir = "nextNode()";
			}

			if (direct == "previousNode"){
				node = walker.previousNode();
				dir = "previousNode()";
			}

			if (node){
				nodeText = node.textContent;
			}

			var result = "currentNode: " + walker.currentNode
				+ "<br>" + "currentNode.textContent: " + walker.currentNode.textContent
				+ "<br><br>" + dir + ": " + node
				+ "<br>" + dir + ".textContent: " + nodeText;

			info2.innerHTML = result;

		}

	</script>

</head>

<body>

	<div id="box">
		<p>Pierwszy <strong>akapit</strong> w <em>kontenerze</em> DIV.</p>
		<P>Drugi <strong>akapit</strong> w <em>kontenerze</em> DIV.</p>
		<P>Trzeci <strong>akapit</strong> w <em>kontenerze</em> DIV.</P>
	</div>

	<p>Kliknij konkretny przycisk by przemierzać kolejne węzły w kontenerze DIV.</p>
	<input type="button" value="parentNode()" onclick="move('parentNode')">
	<input type="button" value="firstChild()" onclick="move('firstChild')">
	<input type="button" value="lastChild()" onclick="move('lastChild')">
	<input type="button" value="nextSibling()" onclick="move('nextSibling')">
	<input type="button" value="previousSibling()" onclick="move('previousSibling')">
	<input type="button" value="nextNode()" onclick="move('nextNode')">
	<input type="button" value="previousNode()" onclick="move('previousNode')">

	<p style="color: blue;">Szczegółowe informacje dla utworzonego przemierzacza drzewa:</p>
	<p id="info1"></p>

	<p style="color: blue;">Szczegółowe informacje dla kolejnych przejść przemierzacza drzewa:</p>
	<p id="info2"></p>

</body>

</html>

Składnia Web IDL#

  1. L
  2. K
  3. T'
  4. T
  5. A
  6. O
  7. Z'
  8. Z
  9. #
interface TreeWalker {
	Node? previousNode();
}

Specyfikacje i inne materiały#

Pasek społecznościowy

SPIS TREŚCI AKTUALNEJ STRONY

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