2008-10-07 15 views
17

Necesito copiar valores de datos de un elemento a otro, pero el método clone() de jQuery no clona los datos. Y no puedo iterar sobre los datos, ya sea:¿Cómo copio los datos de un elemento con jQuery?

element.data().each 

porque data() es una función y no un objeto jQuery. Parece que tengo que mantener una lista separada de los nombres de los atributos y hacer referencia a esos, pero parece demasiado hacky. Entonces, ¿cómo puedo hacer que cualquiera de éstos:

a) iterar sobre los elementos de datos
O
b) clone() un elemento con sus datos.

+0

¿Necesita hacer una clonación del elemento también?¿O solo intenta clonar las variables/funciones que ha agregado al elemento? – Sugendran

+0

[Esta pregunta] (http://stackoverflow.com/questions/122102/what-is-the-most-efficent-way-to-clone-a-javascript-object) analiza la clonación en JQuery, y la diferencia entre una copia profunda y una copia superficial. La respuesta aceptada es la dada por [John Resig] (http://ejohn.org/), ¡quién sabe una o dos cosas sobre JQuery! – ConroyP

+0

Es frustrante que, muchos años después, todavía no haya forma de informar o deshacer preguntas marcadas falsamente como duplicadas. ¿Quién vigila a los vigilantes? –

Respuesta

0

para dar otra alternativa, es decir, en lugar de la clonación de todo el objeto se puede copiar el objeto de datos a una nueva matriz que contiene pares de nombre/valor followingly:


function getOriginalElementData(domElementJQueryObject){ 
    var originalElementData = new Array(); 
    $.each(domElementJQueryObject.data(),function(name,value) { 
     originalElementData.push({"name":name,"value":value}); 
    }); 

    return originalElementData; 
} 

para restaurar los datos a otro objeto:


function restoreOriginalElementData(domElementJQueryObject,originalElementData){ 
    for(var i=0;i<originalElementData.length;i++){ 
     domElementJQueryObject.data(originalElementData[i].name,originalElementData[i].value); 
    } 
} 

La parte para iterar a través de los elementos de datos se copia de esta respuesta: jQuery loop through data() object

3

respuesta a:

a) iterar sobre los elementos de datos

$.each(element.data(), function (name, value) { 
    // ... do something 
}) 

Si el elemento es un elemento DOM, utilice esto:

$.each($.data(element), function (name, value) { 
    // ... do something 
}) 
25

Para realmente sólo copiar los datos- *, esto es bastante sencillo:

$(destination).data($(source).data()); 

Esto es b Debido a que el uso de .data() ningún argumento devolverá un objeto de valor-clave de todos los datos y viceversa, también puede actualizar datos de varias piezas a la vez utilizando un objeto de valor-clave.


ACTUALIZACIÓN 25 de mayo de 2017

aparece una alternativa inteligente en JavaScript jQuery, sin que sea:

Object.assign(destination.dataset, source.dataset); 
+3

Creo que su respuesta es, por lejos, la mejor solución. La respuesta aceptada es solo una referencia a otra pregunta que trata sobre objetos JavaScript, no específicamente elementos HTML y sus atributos de datos. +1 – bozdoz

0

Algo que no fue respondido originalmente como parte de esta pregunta era si deseaba que los atributos de los datos fueran parte del DOM. El uso de muchas de las respuestas proporcionadas lo hará accesible a la API de datos() de jQuery, pero no estará visible en el DOM (para facilitar la depuración, por ejemplo).

Una manera de hacer esto es:

$.each(original.data(), function (name, value) { 
    new.attr('data-' + name, JSON.stringify(value)); 
}); 

Tenga en cuenta que no se requiere explícitamente la stringify. Tengo algunos JSON incrustados en mis etiquetas de datos originales y, si no hago esto, obtengo '[Object object]' como la cadena en lugar del JSON real.

Cuestiones relacionadas