Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

Node: cloneNode()-Methode

Baseline Widely available

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

Die cloneNode()-Methode der Node-Schnittstelle gibt eine Kopie des Knotens zurück, auf dem diese Methode aufgerufen wurde. Ihr Parameter steuert, ob auch der im Knoten enthaltene Unterbaum geklont wird oder nicht.

Standardmäßig kopiert das Klonen eines Knotens alle seine Attribute und deren Werte, einschließlich Ereignis-Listener, die über Attribute spezifiziert wurden. Durch das Setzen des deep-Parameters können Sie auch den im Knoten enthaltenen Unterbaum kopieren. Es wird keine anderen internen Daten kopiert, wie z.B. mit addEventListener() hinzugefügte Ereignis-Listener oder onevent-Eigenschaften (z.B. node.onclick = someFunction), oder das gemalte Bild für ein <canvas>-Element.

Die Methode Document.importNode() erstellt ebenfalls eine Kopie eines Knotens. Der Unterschied besteht darin, dass importNode() den Knoten im Kontext des aufrufenden Dokuments klont, während cloneNode() das Dokument des geklonten Knotens verwendet. Der Dokumentenkontext bestimmt das CustomElementRegistry für die Konstruktion von benutzerdefinierten Elementen. Aus diesem Grund sollten Sie importNode() auf dem Zieldokument verwenden, um Knoten zu klonen, die in einem anderen Dokument verwendet werden sollen. Der HTMLTemplateElement.content gehört zu einem separaten Dokument, daher sollte er auch mit document.importNode() geklont werden, damit benutzerdefinierte Elemente mit den im aktuellen Dokument definierten Definitionen konstruiert werden.

Warnung: cloneNode() kann zu doppelten Element-IDs in einem Dokument führen! Wenn der ursprüngliche Knoten ein id-Attribut hat und die Kopie im selben Dokument platziert wird, sollten Sie die ID der Kopie ändern, um sie eindeutig zu machen.

Auch name-Attribute müssen möglicherweise geändert werden, je nachdem, ob doppelte Namen erwartet werden.

Syntax

js
cloneNode()
cloneNode(deep)

Parameter

deep Optional

Wenn true, dann wird der Knoten und sein gesamter Unterbaum, einschließlich Text, der sich in untergeordneten Text-Knoten befinden kann, ebenfalls kopiert.

Wenn false oder weggelassen, wird nur der Knoten geklont. Der Unterbaum, einschließlich des Textes, den der Knoten enthält, wird nicht geklont.

Beachten Sie, dass deep keine Auswirkung auf leere Elemente hat, wie z.B. die <img>- und <input>-Elemente.

Rückgabewert

Der neue geklonte Node. Der geklonte Knoten hat keinen Elternteil und ist nicht Teil des Dokuments, bis er zu einem anderen Knoten hinzugefügt wird, der Teil des Dokuments ist, unter Verwendung von Node.appendChild() oder einer ähnlichen Methode.

Beispiel

Verwendung von cloneNode()

js
const p = document.getElementById("para1");
const p2 = p.cloneNode(true);

Verwendung von cloneNode() mit Templates

Vermeiden Sie die Verwendung von cloneNode() für den Inhalt eines <template>-Elements, da benutzerdefinierte Elemente im Template nicht aktualisiert werden, bis sie in das Dokument eingefügt werden.

js
class MyElement extends HTMLElement {
  constructor() {
    super();
    console.log("MyElement created");
  }
}
customElements.define("my-element", MyElement);

const template = document.createElement("template");
template.innerHTML = `<my-element></my-element>`;

const clone = template.content.cloneNode(true);
// No log here; my-element is undefined in the template's document
customElements.upgrade(clone);
// Still no log; my-element is still undefined in the template's document
document.body.appendChild(clone);
// Logs "MyElement created"; my-element is now upgraded

Verwenden Sie stattdessen document.importNode(), um den Template-Inhalt zu klonen, sodass alle benutzerdefinierten Elemente unter Verwendung der Definitionen im aktuellen Dokument aktualisiert werden:

js
const clone = document.importNode(template.content, true);
// Logs "MyElement created"; my-element is upgraded using document's definitions
document.body.appendChild(clone);

Spezifikationen

Specification
DOM
# ref-for-dom-node-clonenode①

Browser-Kompatibilität