Range#
stringifier#
Operacja specjalna stringifier
widoczna w definicji Web IDL interfejsu Range oznacza, że obiekt implementujący ten interfejs powinien zostać zamieniony na postać tekstową według niestandardowych reguł określonych w specyfikacji.
Opis działania#
Samo wywołanie i poszczególne jego części najlepiej objaśnić na zapisie składniowym:
var string = range.toString(); // jawnie var string = stringMethod(range); // niejawnie
gdzie poszczególne człony oznaczają:
- string - łańcuch znakowy reprezentujący zakres po konwersji.
- range - zakres będący obiektem kontekstu.
- stringMethod - w przypadku metody o charakterze tekstowym, np.
windo.alert()
lubdocument.write()
, konwersja jest automatyczna.
Algorytm wywołania operacji specjalnej stringifier
nie jest skomplikowany. Dla lepszego zrozumienia tematu prezentuję go w całości:
- Niech s będzie pustym łańcuchem znakowym.
- Jeśli węzeł początkowy jest równy węzłowi końcowemu i jest nim węzeł typu
Text
, to zwróć część danych tekstowych węzłaText
zaczynających się od przesunięcia początkowego i kończących się na przesunięciu końcowym. - Jeśli węzeł początkowy jest typu
Text
, to dodaj do s część danych tekstowych tego węzła zaczynających się od przesunięcia początkowego aż do końca. - Dołącz do s, zgodnie z porządkiem drzewa, połączenie danych tekstowych wszystkich węzłów typu
Text
, które są zawarte w obiekcie kontekstu. - Jeśli węzeł końcowy jest typu
Text
, to dodaj do s część danych tekstowych tego węzła zaczynających się od jego początku aż do przesunięcia końcowego. - Zwróć s.
Z powyższego algorytmu widać wyraźnie, że przy zamianie zakresu na tekst brane pod uwagę są jedynie dane tekstowe z węzłów tekstowych (jeśli występują).
Prosty przykład:
<script>
var box = document.createElement("div");
box.innerHTML = "Pierwszy węzeł tekstowy. "
+ "<p>Drugi węzeł tekstowy (dodatkowo w akapicie).</p>"
+ " Trzeci węzeł tekstowy."
+ "<!-- Jakiś komentarz -->";
// Tworzymy nowy zakres
var range = document.createRange();
// Ustawiamy zakres na całą zawartość kontenera DIV
range.selectNodeContents(box);
document.write(range); // Pierwszy węzeł tekstowy. Drugi węzeł tekstowy (dodatkowo w akapicie). Trzeci węzeł tekstowy.
document.write("<br>");
document.write(range.toString()); // Pierwszy węzeł tekstowy. Drugi węzeł tekstowy (dodatkowo w akapicie). Trzeci węzeł tekstowy.
document.write("<br><br>");
// Ustawiamy zakres między różnymi danymi w węzłach tekstowych kontenera DIV
range.setStart(box.childNodes[0], 5);
range.setEnd(box.childNodes[2], box.childNodes[2].length - 5);
document.write(range); // szy węzeł tekstowy. Drugi węzeł tekstowy (dodatkowo w akapicie). Trzeci węzeł teks
document.write("<br>");
document.write(range.toString()); // szy węzeł tekstowy. Drugi węzeł tekstowy (dodatkowo w akapicie). Trzeci węzeł teks
document.write("<br><br>");
document.write(box.lastChild);
</script>
W poprzedniej specyfikacji istniała definicja dla metody Range.toString()
bezpośrednio w interfejsie Range, ale zgodnie z aktualną specyfikacją DOM jej zachowanie wynika wprost ze specyfikacji Web IDL, i jest to sygnalizowane właśnie poprzez operację specjalną stringifier
.
Operacja specjalna stringifier
pojawia się dopiero w specyfikacji DOM4.
Składnia Web IDL#
interface Range { stringifier; }