Мне нужно скопировать значения данных из одного элемента в другой, но метод jQuery clone () не клонирует данные. И я тоже не могу перебирать данные:
element.data().each
потому что data()
- это функция, а не объект jQuery. Кажется, мне нужно вести отдельный список имен атрибутов и ссылаться на них, но это кажется слишком хакерским. Итак, как я могу сделать одно из этих:
а) Перебрать элементы данных
OR
б) clone()
элемент со своими данными.
Печально, что много лет спустя все еще нет возможности сообщить или отменить вопросы, которые были ошибочно помечены как повторяющиеся. Кто наблюдает за сторожами?
@NexiiMalthus Честно говоря, ответ Джона Ресига (!) Как бы делает этот вопрос более подходящим основным вопросом. Удивлен, увидев, что кто-то все еще ценит Stack Overflow :)
Чтобы дать другую альтернативу, то есть вместо клонирования всего объекта вы можете скопировать объект данных в новый массив, содержащий пары имя / значение следующим образом:
function getOriginalElementData(domElementJQueryObject){
var originalElementData = new Array();
$.each(domElementJQueryObject.data(),function(name,value) {
originalElementData.push({"name":name,"value":value});
});
return originalElementData;
}
Чтобы восстановить данные на другом объекте:
function restoreOriginalElementData(domElementJQueryObject,originalElementData){
for(var i=0;i<originalElementData.length;i++){
domElementJQueryObject.data(originalElementData[i].name,originalElementData[i].value);
}
}
Часть для перебора элементов данных скопирована из этого ответа: Цикл jQuery через объект data ()
Отвечать на:
a) Iterate over data items
$.each(element.data(), function (name, value) {
// ... do something
})
Если element является элементом DOM, используйте это:
$.each($.data(element), function (name, value) {
// ... do something
})
Чтобы действительно скопировать только data- *, это довольно просто:
$(destination).data( $(source).data() );
Это связано с тем, что при использовании .data () без аргументов не будет возвращен объект «ключ-значение» для всех частей данных, и наоборот, вы также можете обновить несколько частей данных одновременно, используя объект «ключ-значение».
ОБНОВЛЕНИЕ 25th May 2017
Умная альтернатива в JavaScript без jQuery выглядит так:
Object.assign(destination.dataset, source.dataset);
Я считаю, что ваш ответ - безусловно, лучшее решение. Принятый ответ - это просто ссылка на другой вопрос, который касается объектов JavaScript, а не конкретно элементов HTML и их атрибутов данных. +1
Что-то, на что изначально не ответили как часть этого вопроса, было то, хотите ли вы, чтобы атрибуты данных были частью DOM. Использование многих из предоставленных ответов сделает его доступным для jQuery data () API, но не будет отображаться в DOM (например, для облегчения таких вещей, как отладка).
Способ сделать это:
$.each(original.data(), function (name, value) {
new.attr('data-' + name, JSON.stringify(value));
});
Обратите внимание, что stringify явно не требуется. У меня есть JSON, встроенный в мои исходные теги данных, и, если я этого не сделаю, я получаю «[Object object]» в виде строки вместо фактического JSON.
Вам также нужно сделать клон элемента? Или вы просто пытаетесь клонировать переменные / функции, которые вы добавили к элементу?