6

Tôi đã nhận thấy một số rò rỉ bộ nhớ trong một ứng dụng tôi đang xây dựng, sau khi chơi xung quanh trong một thời gian FF sẽ bắt đầu sử dụng hết bộ nhớ hơn (lên tới 1 000 000 k).sẽ phá hủy một hộp thoại jQuery loại bỏ bất kỳ trình xử lý nào gắn liền với các phần tử bên trong nó?

Tôi đã thực hiện một số nghiên cứu và thấy rằng nếu tôi thực hiện $(selector).html(some stuff) để thay thế nội dung của trình xử lý jQuery khỏi nội dung trước đó sẽ không bị xóa và gây ra một số vấn đề.

câu hỏi tôi có là nếu tôi hủy một hộp thoại với $(mydialog).dialog('destroy'); các trình xử lý được đính kèm với các thành phần khác nhau trong hộp thoại đó có bị xóa không?

Cảm ơn!

+0

Phiên bản jQuery nào? jQuery cố gắng dọn sạch dữ liệu trên nội dung bị xóa khỏi tài liệu bằng cách sử dụng 'html()' (đó là lý do tại sao nó quá chậm). Theo như tôi thấy, nó sẽ loại bỏ thành công các trình xử lý sự kiện; vẫn sẽ có một rò rỉ nhỏ do bộ nhớ cache phần tử id- phát triển, nhưng nó không phải là nhiều (nó thực sự xấu trong jQuery 1.3 do một hành vi thực sự ngớ ngẩn khiến tất cả các phần tử bị loại bỏ để nhận dữ liệu). – bobince

+0

Tôi đang sử dụng jquery 1.4.1 và jquery ui 1.8.4 – Patricia

Trả lời

5

Không, chúng sẽ không bị xóa, chính phần tử hộp thoại sẽ được trả về trạng thái trước đó, các thành phần bên trong không được chạm vào.

Tiện ích hộp thoại chính nó, các nút, thanh tiêu đề, nút đóng, vv được dọn dẹp, nhưng phần tử bạn đã chuyển thành hộp thoại không bị ảnh hưởng và không được dọn dẹp. Bạn cần phải .empty() hoặc .remove() toàn bộ yếu tố cho điều đó.

+0

ahhh, thú vị. nếu tôi đã làm một $ (this) .remove(); trong callback gần đó sẽ chăm sóc nó có? – Patricia

+0

@Patricia - Yup, chính xác là –

+0

tuyệt vời! cảm ơn: D – Patricia

1

Tôi không chắc chắn nếu phá hủy một hộp thoại với các phương pháp được cung cấp loại bỏ bất kỳ xử lý sự kiện kín, nhưng bạn luôn có thể làm:

$(selector).empty(); 

thay vì:

$(selector).html('blahblah'); // or .html(''); 

rằng sẽ loại bỏ mọi trình xử lý sự kiện bị ràng buộc với bất kỳ phần tử được thay thế nào, và do đó tránh rò rỉ bộ nhớ.

+0

yea, bất cứ nơi nào mà tôi đã có một $ (selector) .html (soem stuff) tôi đã thay đổi nó thành $ (selector) .empty(). html (một số công cụ) để khắc phục những vấn đề đó. tôi đã tự hỏi chính xác hơn những gì đã phá hủy. – Patricia