Node#
Node.normalize()#
Metoda normalize()
normalizuje całą zawartość tekstową dla danego węzła. W uproszczeniu polega to na tym, że usuwane są z niego wszystkie puste węzły typu Text
oraz następuje połączenie pozostałych przyległych węzłów tekstowych w jeden (ten pierwszy) węzeł tekstowy, ale z zachowaniem danych tekstowych ze wszystkich eliminowanych węzłów tekstowych.
Opis działania#
Samo wywołanie i poszczególne jego części najlepiej objaśnić na zapisie składniowym:
node.normalize();
gdzie poszczególne człony oznaczają:
- node - węzeł będący obiektem kontekstu.
Algorytm wywołania metody normalize()
nie jest skomplikowany. Dla lepszego zrozumienia tematu prezentuję go w całości:
Dla każdego (for each) węzła typu
Text
będącego potomkiem w obiekcie kontekstu wykonaj poniższe kroki:- Niech node będzie tym potomkowym węzłem typu
Text
. - Niech length będzie wartością atrybutu
length
w node. - Jeśli length ma wartość zero, to usuń node i kontynuuj (continue) z kolejnym węzłem typu
Text
, jeśli jakiś istnieje. - Niech data będzie połączeniem, zgodnie z porządkiem drzewa, danych tekstowych z przyległych węzłów tekstowych dla node (bez niego samego).
- Zastąp dane tekstowe z węzłem będącym node, z przesunięciem wskazywanym przez length, licznikiem będącym wartością
0
oraz danymi tekstowymi wskazywanymi przez data. - Niech current node będzie bratem następującym dla node.
Dopóki (while) current node jest węzłem typu
Text
wykonuj poniższe podkroki:- Dla każdego (for each) zakresu, którego węzłem początkowym jest current node, dodaj length do jego przesunięcia początkowego i ustaw jego węzeł początkowy na node.
- Dla każdego (for each) zakresu, którego węzłem końcowym jest current node, dodaj length do jego przesunięcia końcowego i ustaw jego węzeł końcowy na node.
- Dla każdego (for each) zakresu, którego węzłem początkowym jest rodzic w current node i przesunięciem początkowym jest indeks w current node, ustaw jego węzeł początkowy na node i jego przesunięcie początkowe na length.
- Dla każdego (for each) zakresu, którego węzłem końcowym jest rodzic w current node i przesunięciem końcowym jest indeks w current node, ustaw jego węzeł końcowy na node i jego przesunięcie końcowe na length.
- Dodaj wartość atrybutu
length
w current node do length. - Ustaw current node na jego brata następującego.
- Usuń, zgodnie z porządkiem drzewa, przyległe węzły tekstowe dla node (bez niego samego).
- Niech node będzie tym potomkowym węzłem typu
Wywołanie metody normalize()
dla danego węzła będzie miało efekt jedynie w przypadku węzłów, których potomkami mogą być węzły tekstowe, czyli na dzień dzisiejszy, zgodnie z dopuszczalną zawartością, dotyczy to węzłów typu Document
, DocumentFragment
oraz Element
.
Prosty przykład:
<script>
var el = document.createElement("div");
el.appendChild(document.createTextNode(" "));
el.appendChild(document.createTextNode("Tekst1"));
el.appendChild(document.createTextNode("Tekst2"));
// Element DIV ma w tym miejscu następujące węzły tekstowe
// " " + "Tekst1" + "Tekst2"
document.write(el.childNodes.length); // 3
document.write("<br>");
// Dodajemy do elementu DIV więcej węzłów
var p1 = document.createElement("p");
p1.textContent = "Akapit1";
var p2 = document.createElement("p");
p2.textContent = "Akapit2";
el.appendChild(p1);
el.appendChild(document.createTextNode(" "));
el.appendChild(document.createTextNode("Tekst3"));
el.appendChild(p2);
el.appendChild(document.createTextNode(""));
// Element DIV ma w tym miejscu następujące węzły tekstowe
// " " + "Tekst1" + "Tekst2" + "Apakit1" + " " + "Tekst3" + "Akapit2" + ""
document.write(el.childNodes.length); // 8
document.write("<br>");
el.normalize();
// Element DIV ma w tym miejscu następujące węzły tekstowe
// " Tekst1Tekst2" + "Apakit1" + " Tekst3" + "Akapit2"
document.write(el.childNodes.length); // 4
</script>
Warto podkreślić, że pusty węzeł w odniesieniu do węzła tekstowego to ten, który w swoich danych tekstowych nie ma żadnego znaku (nawet spacji). Widać to dokładnie w powyższym przykładzie, gdzie wszystkie węzły tekstowe ze spacjami zostały połączone ze swoimi przyległymi węzłami tekstowymi. Ostatni węzeł tekstowy był pusty, dlatego po normalizacji został całkowicie usunięty z węzła wywołującego metodę normalize()
.
Składnia Web IDL#
interface Node : EventTarget { void normalize(); }