Element: innerHTML-Eigenschaft

Baseline Widely available *

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

* Some parts of this feature may have varying levels of support.

Die Element-Eigenschaft innerHTML ruft das HTML- oder XML-Markup innerhalb des Elements ab oder setzt es.

Genauer gesagt erhält innerHTML eine Serialisierung der geschachtelten Kind-DOM-Elemente innerhalb des Elements, oder es setzt HTML oder XML, das geparsed werden soll, um den DOM-Baum innerhalb des Elements zu ersetzen.

Um das HTML in das Dokument einzufügen, anstatt den Inhalt eines Elements zu ersetzen, verwenden Sie die Methode insertAdjacentHTML().

Die Serialisierung des DOM-Baums, die von der Eigenschaft gelesen wird, schließt Shadow-Roots nicht ein — wenn Sie eine HTML-Zeichenkette erhalten möchten, die Shadow-Roots einschließt, müssen Sie stattdessen die Methoden Element.getHTML() oder ShadowRoot.getHTML() verwenden. Ebenso wird beim Setzen des Elementinhalts mit innerHTML die HTML-Zeichenkette in DOM-Elemente geparsed, die keine Shadow-Roots enthalten.

So wird zum Beispiel ein <template> als HTMLTemplateElement geparsed, unabhängig davon, ob das Attribut shadowrootmode angegeben ist oder nicht. Um den Inhalt eines Elements aus einer HTML-Zeichenkette festzulegen, die deklarative Shadow-Roots enthält, müssen Sie entweder Element.setHTMLUnsafe() oder ShadowRoot.setHTMLUnsafe() verwenden.

Wert

Eine Zeichenkette, die die HTML-Serialisierung der Nachkommen des Elements enthält. Das Setzen des Wertes von innerHTML entfernt alle Nachkommen des Elements und ersetzt sie durch Knoten, die durch das Parsen des in der Zeichenkette htmlString angegebenen HTMLs konstruiert werden.

Wenn der Wert auf null gesetzt wird, wird dieser null-Wert in die leere Zeichenkette ("") umgewandelt, sodass elt.innerHTML = null gleichbedeutend mit elt.innerHTML = "" ist.

Ausnahmen

SyntaxError DOMException

Wird ausgelöst, wenn versucht wurde, den Wert von innerHTML mit einer Zeichenkette zu setzen, die nicht korrekt formatiertes HTML ist.

NoModificationAllowedError DOMException

Wird ausgelöst, wenn versucht wurde, das HTML in einen Knoten einzufügen, dessen Elternknoten ein Document ist.

Nutzungshinweise

Lesen der HTML-Inhalte eines Elements

Das Lesen von innerHTML bewirkt, dass der User-Agent das HTML- oder XML-Fragment, das aus den Nachkommen des Elements besteht, serialisiert. Die resultierende Zeichenkette wird zurückgegeben.

js
let contents = myElement.innerHTML;

Dies ermöglicht es Ihnen, das HTML-Markup der Inhaltsknoten des Elements anzusehen.

Hinweis: Das zurückgegebene HTML- oder XML-Fragment wird basierend auf dem aktuellen Inhalt des Elements generiert, sodass das Markup und die Formatierung des zurückgegebenen Fragments wahrscheinlich nicht mit dem ursprünglichen Seitenmarkup übereinstimmen.

Ersetzen des Inhalts eines Elements

Das Setzen des Wertes von innerHTML ermöglicht es Ihnen einfach, den vorhandenen Inhalt eines Elements durch neuen Inhalt zu ersetzen.

Warnung: Dies stellt ein Sicherheitsrisiko dar, wenn die einzufügende Zeichenkette potenziell schädliche Inhalte enthalten könnte. Wenn Sie nutzergelieferte Daten einfügen, sollten Sie stets eine Sanitizer-Bibliothek in Betracht ziehen, um den Inhalt zu bereinigen, bevor er eingefügt wird.

Beispielsweise können Sie den gesamten Inhalt eines Dokuments löschen, indem Sie den Inhalt des body-Attributs des Dokuments leeren:

js
document.body.textContent = "";

In diesem Beispiel wird das aktuelle HTML-Markup des Dokuments geholt und die "<"-Zeichen werden durch die Zeichenreferenz "&lt;" ersetzt, wodurch das HTML im Wesentlichen in einen Rohtext konvertiert wird. Dies wird dann in ein <pre>-Element eingebettet. Dann wird der Wert von innerHTML auf diese neue Zeichenkette geändert. Infolgedessen werden die Dokumentinhalte durch eine Anzeige des gesamten Quellcodes der Seite ersetzt.

js
document.documentElement.innerHTML = `<pre>${document.documentElement.innerHTML.replace(
  /</g,
  "&lt;",
)}</pre>`;

Operative Details

Was geschieht genau, wenn Sie den Wert von innerHTML setzen? Dadurch veranlasst der User-Agent, die folgenden Schritte durchzuführen:

  1. Der angegebene Wert wird als HTML oder XML geparsed (abhängig vom Dokumenttyp), was in einem DocumentFragment-Objekt resultiert, das die neue Menge an DOM-Knoten für die neuen Elemente darstellt.
  2. Wenn das Element, dessen Inhalt ersetzt wird, ein <template>-Element ist, wird dann das content-Attribut des <template>-Elements durch das neue DocumentFragment, das in Schritt 1 erstellt wurde, ersetzt.
  3. Bei allen anderen Elementen wird der Inhalt des Elements durch die Knoten im neuen DocumentFragment ersetzt.

HTML zu einem Element hinzufügen

Das Setzen des Wertes von innerHTML ermöglicht es Ihnen, neuen Inhalt dem bestehenden eines Elements hinzuzufügen.

Beispielsweise können wir ein neues Listenelement (<li>) zu der bestehenden Liste (<ul>) hinzufügen:

HTML

html
<ul id="list">
  <li><a href="#">Item 1</a></li>
  <li><a href="#">Item 2</a></li>
  <li><a href="#">Item 3</a></li>
</ul>

JavaScript

js
const list = document.getElementById("list");

list.innerHTML += `<li><a href="#">Item ${list.children.length + 1}</a></li>`;

Bitte beachten Sie, dass die Verwendung von innerHTML zum Anhängen von HTML-Elementen (z. B. el.innerHTML += "<a href='…'>link</a>") zur Entfernung von zuvor gesetzten Ereignis-Listenern führt. Das heißt, nachdem Sie auf diese Weise ein HTML-Element hinzugefügt haben, können Sie die zuvor gesetzten Ereignis-Listener nicht mehr nutzen.

Sicherheitserwägungen

Es ist nicht ungewöhnlich, dass innerHTML verwendet wird, um Text in eine Webseite einzufügen. Dies könnte zu einem Angriffsvektor auf einer Seite werden und ein potenzielles Sicherheitsrisiko darstellen.

js
let name = "John";
// assuming 'el' is an HTML DOM element
el.innerHTML = name; // harmless in this case

// …

name = "<script>alert('I am John in an annoying alert!')</script>";
el.innerHTML = name; // harmless in this case

Obwohl dies wie ein Cross-Site-Scripting-Angriff aussehen mag, ist das Ergebnis harmlos. Ein mit innerHTML eingefügtes <script>-Tag wird nicht ausgeführt.

Es gibt jedoch Möglichkeiten, JavaScript auszuführen, ohne <script>-Elemente zu verwenden, sodass immer ein Sicherheitsrisiko besteht, wenn Sie innerHTML verwenden, um Zeichenketten zu setzen, über die Sie keine Kontrolle haben. Zum Beispiel:

js
const name = "<img src='x' onerror='alert(1)'>";
el.innerHTML = name; // shows the alert

Aus diesem Grund wird empfohlen, anstelle von innerHTML Folgendes zu verwenden:

  • Node.textContent beim Einfügen von Reintext, da dieser als Rohtext eingefügt wird, anstatt als HTML geparsed zu werden.

Warnung: Wenn Ihr Projekt einer Sicherheitsüberprüfung unterzogen wird, wird die Verwendung von innerHTML höchstwahrscheinlich dazu führen, dass Ihr Code abgelehnt wird. Beispielsweise kann es passieren, dass wenn Sie innerHTML verwenden in einer Browser-Erweiterung und diese bei addons.mozilla.org einreichen, es im Überprüfungsprozess abgelehnt wird. Bitte sehen Sie sich Sicheres Einfügen externer Inhalte in eine Seite für alternative Methoden an.

Beispiele

Dieses Beispiel verwendet innerHTML, um einen Mechanismus zum Protokollieren von Nachrichten in einem Feld auf einer Webseite zu erstellen.

JavaScript

js
function log(msg) {
  const logElem = document.querySelector(".log");

  const time = new Date();
  const timeStr = time.toLocaleTimeString();
  logElem.innerHTML += `${timeStr}: ${msg}<br/>`;
}

log("Logging mouse events inside this container…");

Die log()-Funktion erstellt die Protokollausgabe, indem sie die aktuelle Zeit von einem Date-Objekt mit toLocaleTimeString() abruft und eine Zeichenkette mit dem Zeitstempel und dem Nachrichtentext erstellt. Dann wird die Nachricht der Box mit der Klasse "log" hinzugefügt.

Wir fügen eine zweite Methode hinzu, die Informationen über mousebasierte MouseEvent-Ereignisse protokolliert (wie mousedown, click und mouseenter):

js
function logEvent(event) {
  const msg = `Event <strong>${event.type}</strong> at <em>${event.clientX}, ${event.clientY}</em>`;
  log(msg);
}

Dann verwenden wir dies als Ereignis-Handler für eine Reihe von Mausereignissen auf der Box, die unser Protokoll enthält:

js
const boxElem = document.querySelector(".box");

boxElem.addEventListener("mousedown", logEvent);
boxElem.addEventListener("mouseup", logEvent);
boxElem.addEventListener("click", logEvent);
boxElem.addEventListener("mouseenter", logEvent);
boxElem.addEventListener("mouseleave", logEvent);

HTML

Das HTML ist für unser Beispiel recht einfach.

html
<div class="box">
  <div><strong>Log:</strong></div>
  <div class="log"></div>
</div>

Das <div> mit der Klasse "box" ist nur ein Container für Layoutzwecke, der den Inhalt mit einem Kasten umgibt. Das <div>, dessen Klasse "log" ist, ist der Container für den Protokolltext selbst.

CSS

Das folgende CSS stylt unser Beispielinhalt.

css
.box {
  width: 600px;
  height: 300px;
  border: 1px solid black;
  padding: 2px 4px;
  overflow-y: scroll;
  overflow-x: auto;
}

.log {
  margin-top: 8px;
  font-family: monospace;
}

Ergebnis

Der resultierende Inhalt sieht wie folgt aus. Sie können eine Ausgabe in das Protokoll sehen, indem Sie die Maus in und aus der Box bewegen, darauf klicken und so weiter.

Spezifikationen

Specification
HTML
# dom-element-innerhtml

Browser-Kompatibilität

Siehe auch