Signatur
Beschreibung
insertAdjacentElement() fügt ein vorhandenes oder neu erzeugtes Element relativ zum Element ein, auf dem die Methode aufgerufen wird. Die Zielposition geben Sie mit einem von vier Schlüsselwörtern an: 'beforebegin', 'afterbegin', 'beforeend' oder 'afterend'.
'beforebegin': direkt vor dem Element, als vorheriges Geschwisterelement'afterbegin': innerhalb des Elements, vor dem ersten Kind'beforeend': innerhalb des Elements, nach dem letzten Kind'afterend': direkt nach dem Element, als nächstes Geschwisterelement
Mit einer einzigen Methode decken Sie so die Fälle von before(), prepend(), append() und after() ab. Das ist praktisch, wenn die Position erst zur Laufzeit feststeht, etwa beim Drag & Drop oder beim Einfügen von Hinweisen direkt neben Formularfeldern. Anders als insertAdjacentHTML() parst die Methode kein HTML, sondern arbeitet mit echten DOM-Knoten. Dadurch bleiben Event-Listener und Referenzen erhalten, und es entsteht keine XSS-Gefahr.
Ist das übergebene Element schon im Dokument, wird es verschoben und nicht kopiert. Wenn Sie eine Kopie brauchen, nutzen Sie vorher element.cloneNode(true).
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $position Pflicht | 'beforebegin' | 'afterbegin' | 'beforeend' | 'afterend' | Position relativ zum aufrufenden Element. Groß- und Kleinschreibung spielt keine Rolle. Bei jedem anderen Wert wird ein SyntaxError (DOMException) geworfen. |
|
| $element Pflicht | Element | Das einzufügende Element. Ein bestehendes Element wird von seiner bisherigen Position verschoben. Andere Knotentypen (z. B. Text oder DocumentFragment) führen zu einem TypeError. |
Rückgabewert
null zurück. Das passiert etwa bei 'beforebegin' oder 'afterend', wenn das Element keinen Elternknoten hat.Beispiele
Fehlermeldung direkt hinter ein Eingabefeld setzen
const input = document.querySelector('#email');
const showError = (field, message) => {
// Vorhandene Meldung entfernen
field.nextElementSibling?.classList.contains('error') && field.nextElementSibling.remove();
const error = document.createElement('span');
error.className = 'error';
error.textContent = message; // textContent statt innerHTML: sicher gegen XSS
return field.insertAdjacentElement('afterend', error);
};
const el = showError(input, 'Bitte eine gültige E-Mail-Adresse eingeben.');
console.log(el.outerHTML);
Alle vier Positionen im Vergleich
// HTML: <div id="box"><p>Inhalt</p></div>
const box = document.querySelector('#box');
const make = (text) => Object.assign(document.createElement('em'), { textContent: text });
box.insertAdjacentElement('beforebegin', make('1'));
box.insertAdjacentElement('afterbegin', make('2'));
box.insertAdjacentElement('beforeend', make('3'));
box.insertAdjacentElement('afterend', make('4'));
console.log(box.parentElement.innerHTML);
Listeneintrag verschieben (Sortieren nach oben/unten)
// HTML: <ul><li>A</li><li>B</li><li>C</li></ul>
const moveItem = (item, direction) => {
if (direction === 'up' && item.previousElementSibling) {
item.previousElementSibling.insertAdjacentElement('beforebegin', item);
} else if (direction === 'down' && item.nextElementSibling) {
item.nextElementSibling.insertAdjacentElement('afterend', item);
}
};
const [a] = document.querySelectorAll('li');
moveItem(a, 'down'); // A wird verschoben, nicht kopiert
console.log([...document.querySelectorAll('li')].map(li => li.textContent).join(','));
Rückgabewert null bei losgelöstem Element
const detached = document.createElement('div');
const child = document.createElement('span');
// Kein Elternknoten, deshalb ist 'afterend' nicht möglich
console.log(detached.insertAdjacentElement('afterend', child));
// Innerhalb des Elements funktioniert es
console.log(detached.insertAdjacentElement('beforeend', child) === child);
// Wichtig · Fallstricke
- Kein Parent, kein Geschwister: Hat das aufrufende Element keinen Elternknoten (z. B. frisch mit
createElement()erzeugt) oder ist sein Elternknoten dasDocument, schlagen'beforebegin'und'afterend'fehl. Die Methode gibt dannnullzurück und wirft keinen Fehler. Prüfen Sie den Rückgabewert, wenn das Ergebnis wichtig ist. - Verschieben statt Kopieren: Ein Element, das schon im DOM hängt, wird an seiner alten Stelle entfernt. Wenn Sie eine Kopie brauchen, nutzen Sie
cloneNode(true). Beachten Sie aber, dass Event-Listener dabei nicht mitkopiert werden. - Nur Elemente: Für Text gibt es
insertAdjacentText(), für HTML-ZeichenketteninsertAdjacentHTML(). Mehrere Knoten oder einDocumentFragmentfügen Sie mitbefore(),after(),prepend()oderappend()ein. - Ungültige Position: Tippfehler wie
'afterEnd 'mit Leerzeichen lösen einenSyntaxErroraus. Die Groß- und Kleinschreibung ist dagegen egal. - Sicherheit: Im Gegensatz zu
insertAdjacentHTML()wird nichts geparst. Solange Sie Inhalte übertextContentsetzen, ist die Methode unbedenklich gegenüber XSS. - Kompatibilität: Wird von allen modernen Browsern unterstützt, auch vom Internet Explorer ab Version 8 (dort nur eingeschränkt). Firefox unterstützt die Methode erst ab Version 48.