2012-07-23 36 views
6

Trong tài liệu jquery của hàm "trống rỗng" (http://api.jquery.com/empty/) có tuyên bố sau:jquery trống chức năng và sự kiện xử lý

"To avoid memory leaks, jQuery removes other constructs such as data and event handlers 
from the child elements before removing the elements themselves." 

Văn bản cho biết: "... jQuery xóa các trình xử lý sự kiện khỏi phần tử! CHILD! ...". Nhưng tôi muốn xử lý sự kiện cũng bị loại bỏ khỏi thẻ div ($ ("# mydiv"). Trống). Tôi biết rằng có chức năng "xóa", nhưng ý định của tôi là không xóa thẻ div. Cách tốt nhất để hoàn thành công việc này là gì?

Điều khác là:
Khi họ nói "xóa trình xử lý sự kiện". Họ chỉ loại bỏ các cấu trúc được tạo bằng "bind" hay chúng cũng loại bỏ các cấu trúc được tạo bằng "delegate"?

Thanks a lot trước

Trả lời

8

Để loại bỏ tất cả các xử lý sự kiện ràng buộc từ một phần tử, bạn có thể vượt qua các giá trị đặc biệt "*" với phương pháp off():

$("#mydiv").empty().off("*"); 

Khi tài liệu nói remove events handlers, nó chỉ nói của bị ràng buộc trình xử lý sự kiện, không phải được ủy quyền, vì chúng được liên kết với phần tử tổ tiên (hoặc chính tài liệu) mà không bị ảnh hưởng bởi việc xóa.

Điều này cho phép người xử lý được ủy quyền tiếp tục làm việc như dự định nếu phần tử đã xóa được khôi phục sau này.

+1

Để làm rõ điều này: * Khi họ nói "xóa trình xử lý sự kiện". Do họ chỉ loại bỏ cấu trúc được thực hiện với "ràng buộc" hoặc làm họ cũng loại bỏ các cấu trúc được thực hiện với "đại biểu"? * Nó loại bỏ tất cả các xử lý sự kiện từ các yếu tố, ủy quyền hay không. I E. Nếu bạn có '$ (" # mydiv "), delegate (" div "," click ", fn) .off (" * ")' trình xử lý được gắn với '.delegate' được loại bỏ vì nó nằm trên phần tử. – Esailija

0

Nếu tôi đọc một cách chính xác bạn không muốn các thẻ div gỡ bỏ, bạn chỉ muốn loại bỏ tất cả dữ liệu và xử lý trong trường hợp đó kết hợp các .empty() với:

http://api.jquery.com/unbind/ 

Tuy nhiên lưu ý rằng: " Các trình xử lý sự kiện gắn với .bind() có thể được loại bỏ bằng .unbind(). (Giống như jQuery 1.7, các phương thức .on() và .off() được ưu tiên để đính kèm và loại bỏ các trình xử lý sự kiện trên các phần tử.) Trong trường hợp đơn giản nhất , không có đối số, .unbind() sẽ xóa tất cả các trình xử lý được đính kèm với các phần tử: "

Sử dụng công cụ xóa tương ứng với cách bạn ràng buộc sự kiện.

Nếu bạn muốn phần tử bạn đang gọi bị xóa cũng không sử dụng .empty(), hãy sử dụng .remove() để thay thế.

http://api.jquery.com/remove/ 

"Tương tự như .empty(), phương pháp lệnh .remove() có yếu tố ra khỏi DOM. Sử dụng lệnh .remove() khi bạn muốn loại bỏ các yếu tố bản thân, cũng như tất cả mọi thứ bên trong nó. Ngoài chính các phần tử, tất cả các sự kiện bị ràng buộc và dữ liệu jQuery được liên kết với các phần tử được xóa bỏ Để loại bỏ các phần tử mà không xóa dữ liệu và sự kiện, hãy sử dụng .detach() thay thế. "

1

thử mã jQuery này;

jQuery('#element').bind('click',function(){ 
    console.log('clicked'); 
    }).on('remove',function(){ 
     console.log('element removed'); 
     jQuery(this).unbind('click').off('remove'); 
    }); 

    jQuery('#element').remove(); 
Các vấn đề liên quan