Baseline Weitgehend verfügbar
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit Juli 2015 browserübergreifend verfügbar.
Die cloneNode() Methode des Node Interfaces gibt eine Kopie des Knotens zurück, auf dem diese Methode aufgerufen wurde. Ihr Parameter steuert, ob auch die im Knoten enthaltene Unterstruktur geklont wird oder nicht.
Standardmäßig kopiert das Klonen eines Knotens alle seine Attribute und deren Werte einschließlich der über Attribute spezifizierten Event-Listener. Durch Setzen des deep-Parameters kann auch die im Knoten enthaltene Unterstruktur kopiert werden. Sie kopiert nicht andere interne Daten, wie Event-Listener, die mit addEventListener() oder onevent Eigenschaften (z. B. node.onclick = someFunction) hinzugefügt wurden, oder das gemalte Bild für ein <canvas> Element.
Die Document.importNode() Methode 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 zu klonenden Knotens verwendet. Der Dokumentenkontext bestimmt das CustomElementRegistry für die Konstruktion aller benutzerdefinierten Elemente. Aus diesem Grund sollte importNode() im Ziel-Dokument verwendet werden, um Knoten zu klonen, die in einem anderen Dokument verwendet werden sollen. Der HTMLTemplateElement.content gehört zu einem separaten Dokument, daher sollte er ebenfalls mit document.importNode() geklont werden, damit benutzerdefinierte Elementnachfahren mit den Definitionen im aktuellen Dokument 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 eindeutig zu sein.
Auch name-Attribute müssen möglicherweise geändert werden, abhängig davon, ob doppelte Namen erwartet werden.
Syntax
js
cloneNode()
cloneNode(deep)
Parameter
deepOptional-
Wenn
true, dann wird der Knoten und seine gesamte Unterstruktur, einschließlich des Textes, der sich in untergeordnetenTextKnoten befinden kann, ebenfalls kopiert.Wenn
falseoder weggelassen, wird nur der Knoten geklont. Die Unterstruktur, einschließlich eines Textes, den der Knoten enthält, wird nicht geklont.Beachten Sie, dass
deepkeine Auswirkung auf void elements hat, wie<img>und<input>Elemente.Standardmäßig auf
falsegesetzt.
Rückgabewert
Der neue geklonte Node.
Der geklonte Knoten hat keinen Elternknoten und ist kein Bestandteil des Dokuments,
bis er zu einem anderen Knoten hinzugefügt wird, der Teil des Dokuments ist,
indem Node.appendChild() oder eine ähnliche Methode verwendet wird.
Beispiel
Verwenden von cloneNode()
js
const p = document.getElementById("para1");
const p2 = p.cloneNode(true);
Verwenden von cloneNode() mit Vorlagen
Vermeiden Sie die Verwendung von cloneNode() auf dem Inhalt eines <template> Elements, da benutzerdefinierte Elemente in der Vorlage nicht aktualisiert werden, bis sie in das Dokument eingefügt sind.
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 Vorlageninhalt zu klonen, sodass alle benutzerdefinierten Elemente mit den 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
| Spezifikation |
|---|
| DOM # ref-for-dom-node-clonenode① |
Browser-Kompatibilität
Help improve MDN
Ja NeinErfahren Sie, wie Sie beitragen können Diese Seite wurde automatisch aus dem Englischen übersetzt.