2008-10-07 32 views
17

Tôi cần sao chép các giá trị dữ liệu từ một phần tử này sang phần tử khác, nhưng phương thức clone() của jQuery không sao chép dữ liệu. Và tôi không thể lặp qua dữ liệu:Làm cách nào để sao chép dữ liệu của một phần tử bằng jQuery?

element.data().each 

data() là một hàm chứ không phải đối tượng jQuery. Có vẻ như tôi phải giữ một danh sách riêng biệt của các tên thuộc tính và tham khảo những tên đó nhưng điều đó có vẻ quá hacky. Vậy làm thế nào tôi có thể làm một trong những:

a) lặp qua các mục dữ liệu
HOẶC
b) clone() một phần tử với dữ liệu của nó.

+0

Bạn có cần tạo bản sao của phần tử không?Hay bạn đang cố gắng sao chép các biến/hàm mà bạn đã thêm vào phần tử? – Sugendran

+0

[Câu hỏi này] (http://stackoverflow.com/questions/122102/what-is-the-most-efficent-way-to-clone-a-javascript-object) thảo luận về nhân bản trong JQuery, và sự khác biệt giữa bản sao sâu và bản sao nông. Câu trả lời được chấp nhận là do [John Resig] (http://ejohn.org/) đưa ra, người biết một hoặc hai điều về JQuery! – ConroyP

+0

Thật là bực bội mà nhiều năm sau, vẫn không có cách nào để báo cáo hoặc hoàn tác các câu hỏi được đánh dấu sai là trùng lặp. Ai canh gác người canh gác? –

Trả lời

0

Để cung cấp thay thế khác, ví dụ thay vì nhân bản toàn bộ đối tượng, bạn có thể sao chép các đối tượng dữ liệu vào một mảng mới có chứa các cặp tên/giá trị Followingly:


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

    return originalElementData; 
} 

Để khôi phục dữ liệu đến một đối tượng khác:


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

phần để lặp qua các mục dữ liệu được sao chép từ câu trả lời này: jQuery loop through data() object

3

trả lời đến:

a) lặp qua các mục dữ liệu

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

Nếu phần tử là một phần tử DOM, sử dụng này:

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

Để thực sự chỉ sao chép các đĩa dữ liệu *, đây là khá đơn giản:

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

Đây là b ecause sử dụng .data() không có đối số nào sẽ trả về đối tượng khóa-giá trị của tất cả các phần dữ liệu và ngược lại bạn cũng có thể cập nhật nhiều phần dữ liệu cùng một lúc bằng cách sử dụng đối tượng khóa-giá trị.


CẬP NHẬT 25th May 2017

Một lựa chọn thông minh trong JavaScript mà không jQuery dường như là:

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

Tôi tin rằng câu trả lời của bạn là, cho đến nay, giải pháp tốt nhất. Câu trả lời được chấp nhận chỉ là một giới thiệu cho một câu hỏi khác về các đối tượng JavaScript, chứ không phải các phần tử HTML cụ thể và các thuộc tính dữ liệu của chúng. +1 – bozdoz

0

Cái gì đó đã không được ban đầu được trả lời như là một phần của câu hỏi này liệu bạn có muốn thuộc tính dữ liệu là một phần của DOM hay không. Sử dụng nhiều câu trả lời được cung cấp sẽ làm cho nó có thể truy cập được vào API dữ liệu của jQuery(), nhưng, sẽ không được hiển thị trong DOM (ví dụ như để gỡ lỗi dễ dàng hơn).

Một cách để làm điều này là:

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

Lưu ý rằng stringify không cần một cách rõ ràng. Tôi có một số JSON được nhúng vào các thẻ dữ liệu gốc của tôi và, nếu tôi không làm điều này, tôi nhận được '[Object object]' như là chuỗi thay vì JSON thực tế.

Các vấn đề liên quan