2012-08-07 14 views
5

Questo è relativo alla domanda javascript cloneNode and properties.Perché cloneNode esclude le proprietà personalizzate?

sto vedendo lo stesso comportamento. Node.cloneNode non copia su tutte le proprietà che mi aggiungo (codice dal post originale):

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

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

theClone non contiene alcuna proprietà "dittatore".

non sono stato in grado di trovare alcuna spiegazione del motivo per cui questo è il caso. Lo documentation on MDN afferma che cloneNode "copia tutti i suoi attributi e i loro valori", una linea che viene presa direttamente dallo DOM specification stesso.

Questo sembra rotto per me in quanto rende quasi impossibile fare una copia completa di un albero DOM che contiene le proprietà personalizzate.

Mi manca qualcosa qui?

+0

avrei probabilmente solo evitare di utilizzare cloneNode, e se voglio clonare qualcosa, mi piacerebbe implementare la mia funzione di clonazione per clonare l'elemento come vedo in forma (per esempio, si potrebbe fare uno nuovo utilizzando il costruttore, quindi copia gli attributi, copia le proprietà e possibilmente altre cose personalizzate a seconda del tuo caso specifico). – trusktr

risposta

7

Una proprietà non è uguale a un attributo.

Usa setAttribute() e getAttribute (invece).

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

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

Testato. cloneNodefa include l'attributo personalizzato nel clone, ma quell'attributo non può essere recuperato direttamente. Prova:

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 

Può essere un problema browser con la clonazione expando properties. Ho eseguito un testcase (vedi più avanti) da questo piuttosto vecchio bugzilla report. Non ha funzionato in Chrome e Firefox (entrambe le versioni più recenti).

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

restituisce null –

+0

Quindi suppongo che potrebbe dipendere dal browser? In Chrome (l'ultimo) funziona. – KooiInc

+0

Devi prima creare l'attributo usando prima "createAttribute". https://developer.mozilla.org/en-US/docs/DOM/document.createAttribute. – marteljn

3

Non tutte le proprietà corrispondono a un attributo. L'aggiunta di una proprietà personalizzata a un elemento non aggiunge un attributo, quindi ciò che accade quando lo fai non è coperto dalle specifiche DOM.

In effetti, ciò che accade quando si aggiunge una proprietà a un oggetto host (come un nodo DOM) è completamente non specificato e non è affatto garantito il funzionamento, quindi consiglio vivamente di non farlo. Invece, suggerirei di utilizzare wrapper se si desidera estendere la funzionalità degli oggetti host (come fanno jQuery e molte altre librerie).

+0

Se si utilizzano i wrapper, è necessario creare il proprio metodo per clonare quei wrapper quando si desidera copiare tali dati. Penso che 'cloneNode' dovrebbe essere deprecato, in quanto ci sono semplicemente troppi casi d'uso in cui fallirà completamente. – trusktr

Problemi correlati