Как скопировать данные элемента с помощью jQuery?

Мне нужно скопировать значения данных из одного элемента в другой, но метод jQuery clone () не клонирует данные. И я тоже не могу перебирать данные:

element.data().each

потому что data() - это функция, а не объект jQuery. Кажется, мне нужно вести отдельный список имен атрибутов и ссылаться на них, но это кажется слишком хакерским. Итак, как я могу сделать одно из этих:

а) Перебрать элементы данных
OR
б) clone() элемент со своими данными.

Вам также нужно сделать клон элемента? Или вы просто пытаетесь клонировать переменные / функции, которые вы добавили к элементу?

Sugendran 07.10.2008 15:17
Этот вопрос discusses cloning in JQuery, and the difference between a deep copy and a shallow copy. The accepted answer is that given by Джон Ресиг, who knows a thing or two about JQuery!
ConroyP 07.10.2008 15:26

Печально, что много лет спустя все еще нет возможности сообщить или отменить вопросы, которые были ошибочно помечены как повторяющиеся. Кто наблюдает за сторожами?

Nexii Malthus 22.02.2018 15:57

@NexiiMalthus Честно говоря, ответ Джона Ресига (!) Как бы делает этот вопрос более подходящим основным вопросом. Удивлен, увидев, что кто-то все еще ценит Stack Overflow :)

MDCore 22.02.2018 20:11
Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
21
4
26 503
4

Ответы 4

Чтобы дать другую альтернативу, то есть вместо клонирования всего объекта вы можете скопировать объект данных в новый массив, содержащий пары имя / значение следующим образом:


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

bozdoz 15.05.2014 06:09

Что-то, на что изначально не ответили как часть этого вопроса, было то, хотите ли вы, чтобы атрибуты данных были частью DOM. Использование многих из предоставленных ответов сделает его доступным для jQuery data () API, но не будет отображаться в DOM (например, для облегчения таких вещей, как отладка).

Способ сделать это:

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

Обратите внимание, что stringify явно не требуется. У меня есть JSON, встроенный в мои исходные теги данных, и, если я этого не сделаю, я получаю «[Object object]» в виде строки вместо фактического JSON.

Другие вопросы по теме