2012-10-30 55 views
9

Tôi muốn sao chép một thẻ <select> với thuộc tính dữ liệu của nó nhưng không có sự kiện của nó.Cách sao chép một phần tử có dữ liệu không có sự kiện với JQuery

Sau JQuery Official .clone() api, tôi hiểu rằng tôi có thể sao chép không có dữ liệu và các sự kiện bằng cách gọi $('#grolsh').clone(), hoặc thực hiện một

$('#grolsh').clone(true) mà sẽ sao chép dữ liệu và sự kiện.

Tôi muốn giữ dữ liệu nhưng xóa các sự kiện liên kết với mục gốc.

Trả lời

11

Kể từ phiên bản 1.7, off() là phương pháp ưa thích để hủy liên kết:

$('#grolsh').clone(true).off(); 
+0

Vì vậy, sự khác biệt giữa .off() và .unbind() là gì? –

+1

đọc tại đây http://stackoverflow.com/questions/9113783/whats-the-difference-between-jquery-bind-and-jquery-on –

1

Bằng cách thêm một .off():

$('#grolsh').clone(true) 
    .attr({'id': 'newGrolsh'}) 
    .off() 
    .appendTo('#target'); 

Cập nhật: Như Adrian gợi ý .off sẽ là một giải pháp tốt hơn .unbind

7

Chỉ cần sử dụng

$('#grolsh').clone(); // Sao chép cấu trúc yếu tố

$('#grolsh').clone(true) // Bản sao cả dữ liệu và các sự kiện cùng với cấu trúc

$('#grolsh').clone(true).off() // Bản sao cả dữ liệu và các sự kiện và xóa trình xử lý

Sự kiện bị ràng buộc với .on() và bị xóa bằng cách sử dụng .off();

Sự kiện được liên kết với .bind() và bị xóa bằng cách sử dụng .unbind();

+0

trường hợp đầu tiên không đúng, dữ liệu không được sao chép với 'clone()' và không có đối số http://jsfiddle.net/ALxz4/ – charlietfl

+0

Các tài liệu nêu rõ "Như của jQuery 1.4, tất cả dữ liệu phần tử (được đính kèm bởi phương thức .data()) cũng được sao chép vào bản sao mới." nhưng từ thử nghiệm của tôi, bản sao bình thường() đã không sao chép dữ liệu –

+0

Cảm ơn bạn đã chỉ ra nó .. Cố định các từ :) –

0

Tính từ jQuery phiên bản 1.5, bạn có thể vượt qua tham số thứ hai (Xem: .clone([withDataAndEvents ] [, deepWithDataAndEvents ])) không phải sao chép các xử lý sự kiện:

$('#grolsh').clone(true,false); 
+0

Không, đó chỉ là "Boolean cho biết trình xử lý sự kiện và dữ liệu cho tất cả trẻ em của phần tử nhân bản có được sao chép không." - có vẻ như nếu '# grolsh' của bạn không có bất kỳ sự kiện nào, chỉ cần dữ liệu ... nhưng không phải như thế. –

0

Nếu bạn thực sự chỉ muốn sao chép dữ liệu đính kèm bởi .data() phương pháp don 'sự kiện t lạm dụng (un) ràng buộc và chỉ cần làm:

var $original = $(".originalSelector"); 
var $clone = $original.clone().data($original.data()); 

Bởi vì khi bạn vượt qua một đối tượng để .data() phương pháp, nó mở rộng các dữ liệu hiện tại với nó.

! LƯU Ý QUAN TRỌNG!
Bạn không thể làm điều này nếu bạn định sử dụng thứ gì đó lưu trữ các tham chiếu DOM và sử dụng nó, ví dụ: jQuery UI kéo vv ...
=> chỉ sử dụng vào "tinh khiết" dữ liệu/loại cơ bản

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