2013-06-03 30 views
8

Tôi có một plugin bật lên đặt nội dung html là <div/> với phản hồi của cuộc gọi AJAX.Cần thiết để gọi empty() trước html() hoặc trước innerHTML?

Mỗi khi tôi mở cửa sổ bật lên, trong mã tôi chỉ cần gọi $("#popup").html(response). Điều này sẽ ghi đè nội dung html hiện có bằng nội dung mới.

Tôi có nên gọi $("popup").empty() trước khi tôi gọi $("popup").html(response) để tôi phát hành bộ nhớ trình duyệt được sử dụng bởi các đối tượng trước đây trong div $("popup")? (cuối cùng ngăn rò rỉ bộ nhớ)

PS: nếu tôi gọi $("popup")[0].innerHTML = response thì sao? tôi có nên gọi phương thức .empty() không?

+0

http://stackoverflow.com/questions/8567957/is-empty-enough-for-big-ajaxy-apps?rq=1 –

Trả lời

7

Trả lời ngắn gọn.

jQuery.fn.html sử dụng DOMNode.innerHTML = sau khi thực hiện một số việc khác. Một là xóa mọi dữ liệu được lưu trữ trên các nút (được lưu trữ qua $.fn.data), xem http://james.padolsey.com/jquery/#v=git&fn=jQuery.fn.html để biết tổng quan về nguồn đầy đủ.

.innerHTML xóa trẻ em và thay thế bằng html mới. Nhưng hãy cẩn thận về rò rỉ bộ nhớ. Tôi sẽ sử dụng jQuery.fn.empty trước khi đặt innerHTML. ví dụ.

var a = document.createElement('div'), 
    b = document.createElement('div'); 

    b.appendChild(a); 

    b.innerHTML = 'new innerHMTL'. 

Bạn sẽ nghĩ mọi thứ đều ổn. Nhưng nút thay thế/xóa vẫn được giữ trong biến số a và do đó không được ném vào bộ thu gom rác. Tôi không chắc chắn thời tiết hay không mà jQuery cửa hàng DOMNodes nội bộ cho đến khi bạn gọi jQuery.removeData, vv

1

Không cần gọi empty(). html (response) phương pháp ovverides số existing content.

4

JQuery tài liệu của phương pháp html nói:

Khi .html() được sử dụng để thiết lập nội dung của một nguyên tố, bất kỳ nội dung đó là ở yếu tố đó là hoàn toàn thay thế bằng nội dung mới. Ngoài ra, jQuery loại bỏ các cấu trúc khác như dữ liệu và trình xử lý sự kiện từ các phần tử con trước khi thay thế các phần tử đó bằng nội dung mới.

Vì vậy, bạn không cần phải gọi empty().

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