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:

  1. L
  2. K
  3. T'
  4. T
  5. A
  6. O
  7. Z'
  8. Z
  9. #
var string = range.toString(); // jawnie
var string = stringMethod(range); // niejawnie

gdzie poszczególne człony oznaczają:

Algorytm wywołania operacji specjalnej stringifier nie jest skomplikowany. Dla lepszego zrozumienia tematu prezentuję go w całości:

  1. Niech s będzie pustym łańcuchem znakowym.
  2. 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ła Text zaczynających się od przesunięcia początkowego i kończących się na przesunięciu końcowym.
  3. 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.
  4. 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.
  5. 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.
  6. 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:

  1. L
  2. K
  3. T'
  4. T
  5. A
  6. O
  7. Z'
  8. Z
  9. #
<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#

  1. L
  2. K
  3. T'
  4. T
  5. A
  6. O
  7. Z'
  8. Z
  9. #
interface Range {
	stringifier;
}

Specyfikacje i inne materiały#

Pasek społecznościowy

SPIS TREŚCI AKTUALNEJ STRONY

Range (H1) stringifier (H2) Opis działania (H3) Składnia Web IDL (H3) Specyfikacje i inne materiały (H3)