Element: Eigenschaft innerHTML
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
liest oder setzt das HTML- oder XML-Markup, das im Element enthalten ist.
Genauer gesagt gibt innerHTML
eine Serialisierung der verschachtelten Kind-DOM-Elemente innerhalb des Elements zurück oder setzt HTML oder XML, das analysiert wird, um den DOM-Baum im Element 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 enthält, müssen Sie stattdessen die Methoden Element.getHTML()
oder ShadowRoot.getHTML()
verwenden.
Ebenso enthalten die DOM-Elemente, die aus der mit innerHTML
analysierten HTML-Zeichenkette erstellt werden, keine Shadow Roots.
Zum Beispiel wird <template>
als HTMLTemplateElement
analysiert, unabhängig davon, ob das Attribut shadowrootmode
angegeben ist.
Um die Inhalte eines Elements mit einer HTML-Zeichenkette einzustellen, die deklaratives Shadow Root 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.
Wenn der Wert von innerHTML
gesetzt wird, werden alle Nachkommen des Elements entfernt und durch Knoten ersetzt, die aus der in der Zeichenkette htmlString bereitgestellten HTML-Zeichenkette analysiert werden.
Wenn der Wert null
zugewiesen wird, wird dieser null
-Wert in die leere Zeichenkette (""
) umgewandelt, sodass elt.innerHTML = null
gleichwertig ist mit elt.innerHTML = ""
.
Ausnahmen
SyntaxError
DOMException
-
Wird ausgelöst, wenn versucht wurde, den Wert von
innerHTML
mit einer Zeichenkette zu setzen, die kein korrekt formatiertes HTML ist. NoModificationAllowedError
DOMException
-
Wird ausgelöst, wenn versucht wurde, das HTML in einen Knoten einzufügen, dessen übergeordnetes Element ein
Document
ist.
Nutzungshinweise
Lesen des HTML-Inhalts eines Elements
Das Lesen von innerHTML
führt dazu, dass der Benutzeragent das HTML- oder XML-Fragment serialisiert, das aus den Nachkommen des Elements besteht.
Die resultierende Zeichenkette wird zurückgegeben.
let contents = myElement.innerHTML;
Dies ermöglicht es Ihnen, das HTML-Markup der Inhaltsknoten des Elements zu sehen.
Hinweis: Das zurückgegebene HTML- oder XML-Fragment basiert auf dem aktuellen Inhalt des Elements, sodass das Markup und die Formatierung des zurückgegebenen Fragments wahrscheinlich nicht mit dem ursprünglichen Seiten-Markup übereinstimmen.
Ersetzen des Inhalts eines Elements
Das Setzen des Werts von innerHTML
ermöglicht es Ihnen, den vorhandenen Inhalt eines Elements einfach durch neuen Inhalt zu ersetzen.
Warnung: Dies ist ein Sicherheitsrisiko, wenn die einzufügende Zeichenkette möglicherweise potenziell bösartige Inhalte enthält. Beim Einfügen von benutzereingebenden Daten sollten Sie immer eine Bibliothek zum Sanitieren verwenden, um den Inhalt vor der Einfügung zu bereinigen.
Zum Beispiel können Sie den gesamten Inhalt eines Dokuments löschen, indem Sie den Inhalt der body
-Eigenschaft des Dokuments löschen:
document.body.textContent = "";
In diesem Beispiel wird das aktuelle HTML-Markup des Dokuments abgerufen, die Zeichen "<"
werden durch die Zeichenreferenz "<"
ersetzt, wodurch das HTML im Wesentlichen in reinen Text umgewandelt wird.
Dieser Text wird dann in ein <pre>
-Element eingeschlossen.
Dann wird der Wert von innerHTML
in diese neue Zeichenkette geändert.
Das Ergebnis ist, dass der Inhalt des Dokuments durch eine Anzeige des gesamten Seitenquellcodes ersetzt wird.
document.documentElement.innerHTML = `<pre>${document.documentElement.innerHTML.replace(
/</g,
"<",
)}</pre>`;
Betriebliche Details
Was genau passiert, wenn Sie den Wert von innerHTML
setzen?
Wenn Sie dies tun, führt der Benutzeragent die folgenden Schritte aus:
- Der angegebene Wert wird als HTML oder XML (basierend auf dem Dokumenttyp) analysiert, was zu einem
DocumentFragment
-Objekt führt, das den neuen Satz von DOM-Knoten für die neuen Elemente darstellt. - Wenn das Element, dessen Inhalt ersetzt wird, ein
<template>
-Element ist, wird dann das Attributcontent
des<template>
-Elements durch den neuenDocumentFragment
ersetzt, der in Schritt 1 erstellt wurde. - Bei allen anderen Elementen wird der Inhalt des Elements mit den Knoten im neuen
DocumentFragment
ersetzt.
Anhängen von HTML an ein Element
Das Setzen des Werts von innerHTML
ermöglicht es Ihnen, neuen Inhalt an den bestehenden eines Elements anzuhängen.
Zum Beispiel können wir ein neues Listenelement (<li>
) zu einer bestehenden Liste (<ul>
) hinzufügen:
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
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
, um neue HTML-Elemente hinzuzufügen (z.B. el.innerHTML += "<a href='…'>link</a>"
), zum Entfernen von zuvor gesetzten Ereignis-Listenern führt.
Das heißt, nachdem Sie ein HTML-Element auf diese Weise hinzugefügt haben, können die zuvor festgelegten Ereignis-Listener nicht mehr genutzt werden.
Sicherheitsüberlegungen
Es ist nicht ungewöhnlich, dass innerHTML
verwendet wird, um Text in eine Webseite einzufügen.
Dies könnte leicht zu einem Angriffsvektor auf einer Website werden, was ein potenzielles Sicherheitsrisiko darstellt.
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 aussieht, ist das Ergebnis harmlos.
Ein mit innerHTML
eingefügtes <script>
-Tag wird nicht ausgeführt.
Es gibt jedoch Möglichkeiten, JavaScript ohne <script>
-Elemente auszuführen, sodass immer ein Sicherheitsrisiko besteht, wenn Sie innerHTML
verwenden, um Zeichenfolgen zu setzen, die nicht unter Ihrer Kontrolle stehen.
Zum Beispiel:
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
, wenn Sie reinen Text einfügen, da dieser als Rohtext eingefügt wird, anstatt ihn als HTML zu parsen.
Warnung:
Wenn Ihr Projekt einer Sicherheitsüberprüfung unterzogen wird, wird die Verwendung von innerHTML
mit großer Wahrscheinlichkeit zur Ablehnung Ihres Codes führen.
Wenn Sie beispielsweise innerHTML
verwenden in einer Browser-Erweiterung und diese bei addons.mozilla.org einreichen, könnte sie während des Prüfprozesses abgelehnt werden.
Bitte lesen Sie Sicheres Einfügen externer Inhalte in eine Seite für alternative Methoden.
Beispiele
Dieses Beispiel verwendet innerHTML
, um einen Mechanismus zum Protokollieren von Nachrichten in einem Feld auf einer Webseite zu erstellen.
JavaScript
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.
Anschließend wird die Nachricht an das Feld mit der Klasse "log"
angehängt.
Wir fügen eine zweite Methode hinzu, die Informationen über MouseEvent
-basierte Ereignisse protokolliert (wie mousedown
, click
und mouseenter
):
function logEvent(event) {
const msg = `Event <strong>${event.type}</strong> at <em>${event.clientX}, ${event.clientY}</em>`;
log(msg);
}
Dann verwenden wir dies als Ereignishandler für mehrere Mausereignisse auf dem Feld, das unser Protokoll enthält:
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 für unser Beispiel ist recht einfach.
<div class="box">
<div><strong>Log:</strong></div>
<div class="log"></div>
</div>
Das <div>
mit der Klasse "box"
dient einfach als Container zur Layoutgestaltung und stellt die Inhalte in einer Box dar.
Das <div>
mit der Klasse "log"
ist der Container für den Protokolltext selbst.
CSS
Das folgende CSS gestaltet unseren Beispielinhalt.
.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 Ausgaben in das Protokoll sehen, indem Sie die Maus in und aus der Box bewegen, darin klicken und so weiter.
Spezifikationen
Specification |
---|
HTML # dom-element-innerhtml |
Browser-Kompatibilität
BCD tables only load in the browser
Siehe auch
Node.textContent
undHTMLElement.innerText
Element.insertAdjacentHTML()
Element.outerHTML
- Parsen von HTML oder XML in einen DOM-Baum:
DOMParser
- Serialisieren eines DOM-Baums in eine XML-Zeichenkette:
XMLSerializer
Element.getHTML()
ShadowRoot.getHTML()
Element.setHTMLUnsafe()
ShadowRoot.setHTMLUnsafe()