Node#

Node.cloneNode()#

Metoda cloneNode() kopiuje dany węzeł i zwraca referencję do nowej kopii.

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 cloned = node.cloneNode([deep = false]);

gdzie poszczególne człony oznaczają:

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

  1. Zwróć wynik klonowania dla obiektu kontekstu oraz, jeśli deep ma boolowską wartość true, z ustawieniem flagi klonowania dzieci.

Możliwość pominięcia argumentu dla metody cloneNode() została wprowadzona dopiero w specyfikacji DOM4. Podobnie jest z domyślnym zachowaniem preferującym kopię płytką, która po kolejnej aktualizacji specyfikacji zastąpiła domyślną kopię głęboką (DOM - Bug 23565). Warto zaznaczyć, że dla elementów pustych (nie zawierających żadnej zawartości), np. <img> czy <input>, nie ma znaczenia jaka wartość zostanie przekazana do metody.

Węzeł zwracany przez metodę cloneNode() zostaje skopiowany (opcjonalnie z całą swoją zawartością) z poprzedniego drzewa węzłów, ale nie jest częścią w nowym drzewie dokumentu dopóki nie zostanie dodany do innego węzła należącego do drzewa dokumentu. Dlatego samotna kopia nie będzie posiadała rodzica (wartość null), aczkolwiek dalej posiada jakiegoś właściciela.

Do skopiowania węzła z jednoczesną zmianą jego właściciela służy metoda Document.importNode().

Kopiowanie węzłów jest bardzo pożyteczne i w niektórych okolicznościach pozwala zwiększyć wydajności tworzonych skryptów. Mając rozległą strukturę węzłową szybciej odtworzymy ją za pomocą kopiowania, niż gdybyśmy ręcznie tworzyli każdy węzeł z takiej struktury.

Prosty przykład:

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

	var newEl = document.createElement("div");
	newEl.innerHTML = "<p>Pierwsze dziecko.</p><p>Drugie dziecko.</p>";

	document.write(newEl.cloneNode().childNodes.length); // 0 (kopia płytka)
	document.write("<br>");
	document.write(newEl.cloneNode(false).childNodes.length); // 0 (kopia płytka)
	document.write("<br>");
	document.write(newEl.cloneNode(0).childNodes.length); // 0 (kopia płytka)
	document.write("<br>");
	document.write(newEl.cloneNode("").childNodes.length); // 0 (kopia płytka)
	document.write("<br>");
	document.write(newEl.cloneNode(undefined).childNodes.length); // 0 (kopia płytka)

	document.write("<br><br>");

	document.write(newEl.cloneNode(true).childNodes.length); // 2 (kopia głęboka)
	document.write("<br>");
	document.write(newEl.cloneNode("false").childNodes.length); // 2 (kopia głęboka)
	document.write("<br>");
	document.write(Boolean("false")); // true

</script>

Warto zwrócić uwagę na warianty, gdzie metodzie cloneNode() przekazano argumenty innego typu niż boolowskie true lub false. Jest to jak najbardziej prawidłowe, wartości te zostaną automatycznie skonwertowane przez maszynę JS na odpowiadającą wartość boolowską. Można porównać z ręcznym wymuszeniem konwersji zaprezentowanym w ostatniej linijce przykładu.

Składnia Web IDL#

  1. L
  2. K
  3. T'
  4. T
  5. A
  6. O
  7. Z'
  8. Z
  9. #
interface Node : EventTarget {
	Node cloneNode(optional boolean deep = false);
}

Specyfikacje i inne materiały#

Pasek społecznościowy

SPIS TREŚCI AKTUALNEJ STRONY

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