jQuery clone () không nhân bản liên kết sự kiện, ngay cả với on ()


100

Tôi đã tạo một loạt các sự kiện jQuery tùy chỉnh để sử dụng trong các ứng dụng web di động. Chúng hoạt động tuyệt vời và đã được thử nghiệm. Tuy nhiên, tôi đã gặp phải một vấn đề nhỏ mà tôi đang khó hiểu.

Tôi đang sử dụng .clone()trên một vài phần tử trong DOM, có chứa một nút. Nút có một số sự kiện tùy chỉnh được liên kết với nó (các sự kiện được ràng buộc bằng cách sử dụng .on()), nhưng. Thật không may, khi tôi sử dụng jQuery .clone(), các ràng buộc không được giữ nguyên và tôi phải thêm lại chúng.

Có ai đã gặp phải điều này trước đây, có ai đó biết về một công việc tiềm năng xung quanh không? Tôi nghĩ rằng việc sử dụng .on()được cho là để bảo toàn ràng buộc cho các phần tử tồn tại ở hiện tại hoặc trong tương lai?


"Tôi nghĩ rằng việc sử dụng .on () được cho là để bảo toàn ràng buộc cho các phần tử tồn tại ở hiện tại hay trong tương lai?" - Điều này ít liên quan đến .clone; đó là logic ủy quyền sự kiện của jQuery và hoạt động nếu bạn chuyển một bộ chọn bổ sung vào .on.
pimvdb

Câu trả lời:


213

Tôi nghĩ bạn nên sử dụng phương thức .clone () quá tải này :

$element.clone(true, true);

nhân bản ([withDataAndEvents] [, deepWithDataAndEvents])

withDataAndEvents : Một Boolean cho biết liệu các trình xử lý sự kiện và dữ liệu có nên được sao chép cùng với các phần tử hay không. Giá trị mặc định là sai.

deepWithDataAndEvents : Một Boolean cho biết liệu các trình xử lý sự kiện và dữ liệu cho tất cả các phần tử con của phần tử được sao chép có nên được sao chép hay không. Theo mặc định, giá trị của nó khớp với giá trị của đối số đầu tiên (mặc định là false).


Hãy lưu ý rằng điều .on()đó không thực sự ràng buộc các sự kiện với các mục tiêu mà với phần tử bạn đang ủy quyền. Vì vậy, nếu bạn có:

$('#container').on('click', '.button', ...);

Các sự kiện thực sự được liên kết với #container. Khi nhấp chuột vào một .buttonphần tử xảy ra, nó bong bóng lên #containerphần tử Phần tử đã kích hoạt sự kiện được đánh giá dựa trên tham số bộ chọn .on()và nếu nó khớp, trình xử lý sự kiện sẽ được thực thi. Đây là cách hoạt động của phái đoàn sự kiện.

Nếu bạn sao chép phần tử #container, bạn phải sao chép sâu các sự kiện và dữ liệu để các liên kết được tạo với .on()được bảo toàn.

Điều này sẽ không cần thiết nếu bạn đang sử dụng .on()trên phụ huynh của #container.


20
Không bao giờ biết .clone()lập luận được chấp nhận. FML. Cảm ơn bạn đã giúp đỡ.
BenM

1
@DidierGhys Cảm ơn, tôi đã gặp khó khăn với việc .clone()không sao chép .data()(cả data-xxxx="somedata"và dữ liệu trong DOM) .. Điều này cũng sửa được!
Richard de Wit,

Tôi đã hỏi Câu hỏi này , nhưng không ai trả lời tôi. Bạn có thể giúp tôi được không?
Ali Soltani

Tuyệt vời, tôi đã phải thực hiện một clicksự kiện để thêm div nhân bản mới. readykhông hoạt động
csandreas1

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.