Poznajemy kolejne trzy metody klasy Element, które powinniśmy znać. Do dzieła.

Ok, element.insertAdjacentElement przyjmuje dwa argumenty, jeden to miejsce, gdzie ma wstawić, drugi to Element:

  • beforebegin, czyli przed tagiem, przed elementem
  • afterbegin, czyli wewnątrz tagu, na samym początku
  • beforeend, czyli wewnątrz tagu, przed końcem
  • afterend, czyli po tagu, na zewnątrz elementu

Można to tak zobrazować:

<!-- beforebegin -->
<p>
  <!-- afterbegin -->
  foo
  <!-- beforeend -->
</p>
<!-- afterend -->

Ok, fajnie, zróbmy taki markup:

<ul id="list"></ul>

I teraz się pobawmy:

let ul = document.querySelector("#list");

let header = document.createElement("h1");
header.textContent = "Heading beforestart of ul";

let para = document.createElement("p");
para.textContent = "Para afterend of ul";

let textNode = document.createTextNode("Text afterbegin ul");

let li = document.createElement("li");
li.textContent = "Li beforeend ul";

ul.insertAdjacentElement('beforebegin', header);
ul.insertAdjacentElement("afterend", para);
ul.insertAdjacentElement("afterbegin", textNode); //fail
ul.insertAdjacentElement("beforeend", li);

No i mamy fail, bo jak nazwa metody wskazuje, ona jest do wstawianie elementów, nie węzłów. Ale mamy metodę insertAdjacentText:

let ul = document.querySelector("#list");

let header = document.createElement("h1");
header.textContent = "Heading beforestart of ul";

let para = document.createElement("p");
para.textContent = "Para afterend of ul";

let li = document.createElement("li");
li.textContent = "Li beforeend ul";

ul.insertAdjacentElement('beforebegin', header);
ul.insertAdjacentElement("afterend", para);
ul.insertAdjacentText("afterbegin", "Text afterbegin ul: "); //ok
ul.insertAdjacentElement("beforeend", li);

Tylko ta metoda wymaga przekazania tekstu, nie węzła tekstowego. Oczywiście możemy użyć metody insertBefore klasy node:

let ul = document.querySelector("#list");

let header = document.createElement("h1");
header.textContent = "Heading beforestart of ul";

let para = document.createElement("p");
para.textContent = "Para afterend of ul";

let textNode = document.createTextNode("Text before first child node ul: ");

let li = document.createElement("li");
li.textContent = "Li beforeend ul";

ul.insertAdjacentElement('beforebegin', header);
ul.insertAdjacentElement("afterend", para);
ul.insertBefore(textNode, ul.childNodes[0]);
ul.insertAdjacentElement("beforeend", li);

Też działa. To wszystko możemy zastąpić jeszcze inną metodą, mianowicie insertAdjacentHTML:

let ul = document.querySelector("#list");

ul.insertAdjacentHTML("beforebegin", `<h1>Header beforebegin ul</h1>`);
ul.insertAdjacentHTML("afterend", `<p>Para afterend ul</p>`);
ul.insertAdjacentHTML("afterbegin", `Text Node afterbegin:`);
ul.insertAdjacentHTML("beforeend", `<li>List item beforeend ul</li>`);

Aczkolwiek możemy nie chcieć takich metod z dwóch powodów:

  • Nie jest to szczególnie bezpieczne, choć mówimy tu o frontendzie, ale jednak
  • Skoro mamy do czynienia z tekstem, to odpadają wszystkie buildery, fasady, pozwalające krok po kroku budować elementy/węzły, edytować ich atrybuty i tak dalej, tekst to tekst

Tym sposobem znamy już niemal wszystkie (nie licząc takich, jak adoptNode czy importNode) sposoby wstawiania elementów/węzłów do drzewa DOM.