2012-08-07 15 views
5

Dies steht im Zusammenhang mit der Frage javascript cloneNode and properties.Warum schließt cloneNode benutzerdefinierte Eigenschaften aus?

Ich sehe das gleiche Verhalten. Node.cloneNode kopiert nicht über alle Eigenschaften, die ich selbst hinzufügen (Code aus Original-Beitrag):

var theSource = document.getElementById("someDiv") 
    theSource.dictator = "stalin"; 

    var theClone = theSource.cloneNode(true); 
    alert(theClone.dictator); 

theClone keine Eigenschaft enthält „Diktator“.

Ich konnte keine Erklärung dafür finden, warum dies der Fall ist. Die documentation on MDN besagt, dass cloneNode "alle seine Attribute und ihre Werte kopiert", eine Zeile, die direkt aus der DOM specification selbst übernommen wird.

Das scheint mir kaputt zu sein, da es fast unmöglich ist, eine tiefe Kopie eines DOM-Baums mit benutzerdefinierten Eigenschaften zu erstellen.

Fehle ich hier etwas?

+0

Ich würde wahrscheinlich nur vermeiden, cloneNode zu verwenden, und wenn ich etwas klonen möchte, würde ich meine eigene Klonfunktion implementieren, um das Element zu klonen, wie ich es für richtig halte (zum Beispiel könnte man mit dem Konstruktor einen neuen erzeugen) Kopieren Sie Attribute, Kopiereigenschaften und möglicherweise andere benutzerdefinierte Sachen, abhängig von Ihrem speziellen Fall). – trusktr

Antwort

7

Eine Eigenschaft ist nicht gleich einem Attribut.

Verwenden Sie stattdessen setAttribute() und getAttribute().

var theSource = document.getElementById("someDiv") 
theSource.setAttribute('dictator','stalin'); 

var theClone = theSource.cloneNode(true); 
alert(theClone.getAttribute('dictator')); 
2

Getestet dies. cloneNodeenthält das benutzerdefinierte Attribut im Klon, aber dieses Attribut kann nicht direkt abgerufen werden. Versuchen:

var theSource = document.getElementById("someDiv") 
theSource.dictator = "stalin"; 
//or better/more cross browser compatible 
theSource.setAttribute('dictator','stalin'); 

var theClone = theSource.cloneNode(true); 
alert(theClone.getAttribute('dictator')); //so, use getAttribute 

Es kann expando properties mit dem Klonen ein Browser Problem sein. Ich habe eine testcase (siehe später) von diesem ziemlich alten bugzilla report ausgeführt. Es funktionierte nicht in Chrome und Firefox (beide neueste Versionen).

//code from testcase @ bugzilla 
var a = document.createElement("div");  
a.order = 50;  
alert(a.order);  
b = a.cloneNode(true);  
alert(b.order);  
+0

es gibt Null –

+0

Dann nehme ich an, dass es Browser abhängig sein kann? In Chrome (neuesten) funktioniert das. – KooiInc

+0

Sie müssen zuerst das Attribut mit 'createAttribute' erstellen. https://developer.mozilla.org/en-US/docs/DOM/document.createAttribute. – marteljn

3

Nicht jede Eigenschaft entspricht einem Attribut. Das Hinzufügen einer benutzerdefinierten Eigenschaft zu einem Element fügt kein Attribut hinzu. Was also passiert, wird von der DOM-Spezifikation nicht abgedeckt.

In der Tat, was passiert, wenn Sie eine Eigenschaft zu einem Host-Objekt hinzufügen (wie ein DOM-Knoten) ist völlig unspezifiziert und ist keineswegs garantiert zu arbeiten, also würde ich dringend empfehlen, es zu tun. Stattdessen würde ich vorschlagen, Wrapper zu verwenden, wenn Sie die Funktionalität von Host-Objekten erweitern möchten (wie jQuery und viele andere Bibliotheken).

+0

Wenn Sie Wrapper verwenden, müssen Sie eine eigene Methode zum Klonen dieser Wrapper erstellen, wenn Sie diese Daten kopieren möchten. Ich denke, "cloneNode" sollte einfach veraltet sein, da es einfach zu viele Anwendungsfälle gibt, in denen es einfach nur scheitern wird. – trusktr

Verwandte Themen