NodeIterator#
NodeIterator.referenceNode#
Właściwość referenceNode
zwraca węzeł referencyjny w danym iteratorze węzłowym. Właściwość jest tylko do odczytu.
Opis działania#
Samo wywołanie i poszczególne jego części najlepiej objaśnić na zapisie składniowym:
var iterator_ref = nodeIterator.referenceNode;
gdzie poszczególne człony oznaczają:
- iterator_ref - węzeł referencyjny.
- nodeIterator - iterator węzłowy będący obiektem kontekstu.
Węzeł referencyjny jest ostatnim węzłem, na którym został zakotwiczony iterator węzłowy. W przypadku tworzenia iteratora domyślnie staje się nim korzeń przekazany do metody Document.createNodeIterator()
. Przy przechodzeniu do kolejnych węzłów za pomocą metod NodeIterator.nextNode()
i NodeIterator.previousNode()
węzeł referencyjny może ulec zmianie (przeważnie wartością będzie ten sam węzeł, który zostaje zwrócony przez te metody, ale nie zawsze tak będzie).
Nie należy zapominać także o sytuacji, w której będziemy usuwali węzeł w drzewie węzłów na którym iterator operuje, tutaj także może nastąpić zmiana węzła referencyjnego. W razie jakiś niejasności należy samodzielnie przeanalizować kroki przed-usuwania zdefiniowane wyłącznie dla interfejsu NodeIterator.
Prosty przykład:
<!DOCTYPE html>
<html>
<head>
<script>
function iterate(direct){
var info1 = document.getElementById("info1");
var info2 = document.getElementById("info2");
var root = document.getElementById("box");
var dir = "";
var node = "";
var nodeText = "";
if (typeof iterator != "object"){
iterator = document.createNodeIterator(root, NodeFilter.SHOW_ELEMENT, null);
}
if (info1.textContent == ""){
info1.innerHTML = "pointerBeforeReferenceNode: " + iterator.pointerBeforeReferenceNode
+ "<br><br>" + "root: " + iterator.root
+ "<br>" + "referenceNode: " + iterator.referenceNode
+ "<br>" + "referenceNode.textContent: " + iterator.referenceNode.textContent;
}
if (direct == "next"){
node = iterator.nextNode();
dir = "nextNode()";
}
if (direct == "previous"){
node = iterator.previousNode();
dir = "previousNode()";
}
if (node){
nodeText = node.textContent;
}
var result = "pointerBeforeReferenceNode: " + iterator.pointerBeforeReferenceNode
+ "<br><br>" + "referenceNode: " + iterator.referenceNode
+ "<br>" + "referenceNode.textContent: " + iterator.referenceNode.textContent
+ "<br><br>" + dir + ": " + node
+ "<br>" + dir + ".textContent: " + nodeText;
info2.innerHTML = result;
}
</script>
</head>
<body>
<div id="box">
<p>Pierwszy akapit w kontenerze DIV.</p>
<P>Drugi akapit w kontenerze DIV.</p>
<P>Trzeci akapit w kontenerze DIV.</P>
</div>
<p>Kliknij konkretny przycisk by iterować przez kolejne węzły w kontenerze DIV.</p>
<input type="button" value="nextNode()" onclick="iterate('next')">
<input type="button" value="previousNode()" onclick="iterate('previous')">
<p style="color: blue;">Szczegółowe informacje dla utworzonego iteratora:</p>
<p id="info1"></p>
<p style="color: blue;">Szczegółowe informacje dla kolejnych przejść iteratora:</p>
<p id="info2"></p>
</body>
</html>
Na chwilę obecną jedynie przeglądarki Firefox i Chrome (oraz te oparte na WebKicie) obsługują właściwość referenceNode
.
Właściwość referenceNode
pojawia się dopiero w specyfikacji DOM4 (wyjaśnienie).
Składnia Web IDL#
interface NodeIterator { readonly attribute Node referenceNode; }