2012-08-07 11 views
5

Esto está relacionado con la pregunta javascript cloneNode and properties.¿Por qué cloneNode excluye propiedades personalizadas?

Estoy viendo el mismo comportamiento. Node.cloneNode no copia sobre las propiedades que agrego a mí mismo (código de entrada original):

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

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

theClone no contiene ninguna propiedad "dictador".

No he podido encontrar ninguna explicación de por qué este es el caso. El documentation on MDN indica que cloneNode "copia todos sus atributos y sus valores", una línea que se toma directamente del DOM specification.

Esto me parece que no funciona, ya que es casi imposible hacer una copia profunda de un árbol DOM que contiene propiedades personalizadas.

¿Falta algo aquí?

+0

Probablemente evitaría usar cloneNode, y si quiero clonar algo, implementaría mi propia función de clonación para clonar el elemento como mejor me parezca (por ejemplo, podría crear uno nuevo usando el constructor, luego copiar atributos, copiar propiedades y posiblemente otras cosas personalizadas dependiendo de su caso específico). – trusktr

Respuesta

7

Una propiedad no es igual a un atributo.

Use setAttribute() y getAttribute() en su lugar.

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

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

Has probado esto. cloneNodedoes incluyen el atributo personalizado en el clon, pero ese atributo no se puede recuperar directamente. Proveedores:

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 

Puede ser un problema del navegador con la clonación expando properties. Ejecuté un testcase (ver más adelante) de este bastante viejo bugzilla report. No funcionó en Chrome y Firefox (ambas versiones más recientes).

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

devuelve nulo –

+0

Entonces, ¿supongo que puede ser dependiente del navegador? En Chrome (último) esto funciona. – KooiInc

+0

Primero debe crear el atributo usando 'createAttribute'. https://developer.mozilla.org/en-US/docs/DOM/document.createAttribute. – marteljn

3

No todas las propiedades corresponden a un atributo. Agregar una propiedad personalizada a un elemento no agrega un atributo, por lo que lo que sucede cuando lo haces no está cubierto por la especificación DOM.

De hecho, lo que sucede cuando agrega una propiedad a un objeto host (como un nodo DOM) no está especificado y no está garantizado que funcione, por lo que le recomiendo que no lo haga. En su lugar, sugiero usar wrappers si desea extender la funcionalidad de los objetos host (como lo hacen jQuery y muchas otras bibliotecas).

+0

Si usa los contenedores, necesitará hacer su propio método para clonar esos contenedores cuando quiera copiar esos datos. Creo que 'cloneNode' debería estar en desuso, ya que simplemente hay demasiados casos de uso en los que simplemente fallará. – trusktr

Cuestiones relacionadas