Javascript insertAdjacentElement

insertAdjacentHTML () fügt einen HTML-String vor oder nach einem bestehenden Element ins DOM ein. Anders als innerHTML überschreibt insertAdjacentHTML vorhandenen Inhalt nicht. insertAdjacentElement () fügt ein echtes DOM-Element ein, insertAdjacentText nur reinen Text.

insert adjacent und insert adjacent text

insertAdjacent

insertAdjacent gibt es in drei Variationen:

Methode Erwartet Parsen von HTML Typische Verwendung
insertAdjacentHTML String mit HTML ja Schnelles Einfügen von fertigem Markup
insertAdjacentElement DOM-Element nein Sauberes Erstellen & Manipulieren von Nodes
insertAdjacentText String mit Text nein Nur Text einfügen (ohne HTML-Interpretation)

Alle drei Methoden haben einen Parameter position , der die Position für das Einfügen bestimmt.

beforebegin
Fügt newElem direkt vor dem aktuellen Element (als previous sibling).
afterend
Fügt newElem direkt nach dem aktuellen Element ein (als next sibling).
afterbegin
Fügt newElem als erstes Kind des aktuellen Elements ein (als firstChild).
beforeend
Fügt newElem als letztes Kind des aktuellen Elements ein (als lastChild).

Der zweite Parameter ist das einzufügende Element.

elem.insertAdjacentElement(position, newElem);

// oder 

const inserted = elem.insertAdjacentElement(position, newElem);
Javascript insert Element before or after

insertAdjacentHTML: HTML-String an Position einfügen

insertAdjacentHTML fügt zusätzlichen Inhalt ein, aber berührt – anders als innerHTML – bereits existierende Elemente nicht.

<div class="demo">
	<button class="btn" id="addItems">Früchte hinzufügen</button>
	<ul id="list"></ul>
</div>
    const list = document.querySelector("#list");
    const addItems  = document.querySelector("#addItems");
    
    addItems.addEventListener("click", () => {
    	const items = ["🍋", "🍎", "🍒", "🍐"];
    
    	items.forEach(item => {
    		list.insertAdjacentHTML(
    			"beforeend", 
    			`<li class="fruit">${item}</li>`
    		);
    	});
    });
    

    Jeder Klick auf den Button fügt alle Früchte als li-Elemente am Ende der Liste ein. Jedes Element wird geparst und kann danach mit .querySelector(".fruit") gefunden oder mit CSS gestylt werden. Zwar könnte man auch innerHTML benutzen:

    list.innerHTML += `<li>${item}</li>`;
    

    Das überschreibt jedes Mal das gesamte HTML im Container, ist langsamer und verliert Event-Listener auf seinen Kind-Elementen.

    Um nur den Text einzusetzen, nicht aber u.U. enthaltene Elemente zu überschreiben, müsste mit innerHTML der komplette Inhalt vor und nach dem zu einzusetzenden Text gesichert und erneut eingesetzt werden. elem.insertAdjacentHTML lässt vorhandene Elemente und Inhalte stehen und fügt nur neuen Inhalt – Text und HTML – hinzu.

    elem.insertAdjacentHTML ist praktisch, um Chat-Nachrichten anzuhängen, Produktkarten im Shop dynamisch nachzuladen oder Tabellenzeilen aus JSON zu generieren.

    Methode Wann benutzen? Unterstützt HTML? Ersetzt gesamten Inhalt?
    insertAdjacentHTML() Für gezieltes Einfügen von HTML Ja Nein
    innerHTML Wenn der gesamte Inhalt ersetzt werden soll Ja Ja
    textContent Wenn nur reiner Text gesetzt werden soll Nein Ja

    insertAdjacentElement: DOM-Element an Position einfügen

    insertAdjacentElement (position, elem) erwartet keinen String, sondern ein echtes DOM-Element, das z.B. mit document.createElement() erzeugt wird. Der Vorteil gegenüber insertAdjacentHTML (position, HTMLString): insertAdjacentElement ist typsicher. Eigenschaften wie .classList.add, .dataset, .textContent usw. können angewendet werden, bevor das Element in das DOM eingefügt wird.

    <button id="bar">Bild anzeigen</button>
    
    const bar = document.querySelector("#bar");
    bar.addEventListener ("click", () => {
    	const pict = document.createElement("img");
    	pict.src = "flowers.webp";
    	pict.width = "490";
    	pict.height = "300";
    	pict.classList = "Blumen";
    	bar.insertAdjacentElement("afterend", pict);
    });
    

    Weitere Methoden zum Einfügen neuer Elemente

    insertAdjacentElement () ist flexibel und präzise, aber auch komplex und stocksteif. Die modernen Browser unterstützen before, after, replaceWith, remove, um Elemente ohne Umwege über das Parent-Element als childNode einzufügen.

    Aufgabe insertAdjacent* Variante Modernere Variante
    Vor Element einfügen el.insertAdjacentElement("beforebegin", n) el.before(n)
    Nach Element einfügen el.insertAdjacentElement("afterend", n) el.after(n)
    Als erstes Kind einfügen el.insertAdjacentElement("afterbegin", n) el.prepend(n)
    Als letztes Kind einfügen el.insertAdjacentElement("beforeend", n) el.append(n)
    Element ersetzen el.replaceWith(n)
    Element löschen el.remove()

    Auch wenn die Methoden before und after in vielen Fällen einfacher sind, können sie nicht immer alle Positionen abdecken. insertAdjacentElement ist präziser.

    insertAdjacentHTML ist effizienter, wenn viele HTML-Elemente in einem Schritt einzufügen sind. Das gilt auch für insertAdjacentText, wenn einfacher Text an einer bestimmten Position eingefügt werden soll, ohne dass er als HTML interpretiert wird.

    insertAdjacentHTML vs innerHTML vs textContent

    Methode Wann benutzen? Unterstützt HTML? Ersetzt gesamten Inhalt?
    insertAdjacentHTML() Für gezieltes Einfügen von HTML Ja Nein
    innerHTML Wenn der gesamte Inhalt ersetzt werden soll Ja Ja
    textContent Wenn nur reiner Text gesetzt werden soll Nein Ja
    Suchen auf mediaevent.de