2009-06-27 37 views
7

Tôi vừa phát hiện ra rằng khi hàm remove() được sử dụng, các phần tử đã so khớp không bị loại bỏ khỏi đối tượng jQuery, chỉ là DOM.

Theo remove() documentation:

Loại bỏ tất cả các yếu tố phù hợp với từ DOM. Điều này KHÔNG loại bỏ chúng khỏi đối tượng jQuery, cho phép bạn sử dụng thêm các yếu tố phù hợp hơn nữa.

Chắc chắn nếu ứng dụng web tiếp tục thêm và xóa các phần tử khỏi dom, điều này sẽ tiếp tục sử dụng nhiều bộ nhớ hơn? Ai đó có thể xác nhận nếu đây là trường hợp? Có thể làm gì để tránh điều này?

Trả lời

7

Tôi nghĩ rằng nó sẽ được thu gom rác (cuối cùng) khi nó rơi ra khỏi phạm vi. Nếu bạn đang gặp vấn đề với việc sử dụng bộ nhớ quá mức, mặc dù bạn có thể thử sử dụng toán tử delete trên đối tượng được trả về.

+0

Có. DOM bị thay đổi nhưng đối tượng jQuery thì không. Nếu bạn đã gán đối tượng jQuery cho một biến, trình thu gom rác sẽ có một ảnh tại biến đó khi nó nằm ngoài phạm vi. – Nosredna

2

Tôi đã cố gắng tìm câu trả lời cho câu hỏi của riêng mình bằng cách thực hiện một bài kiểm tra nhỏ.

<script type="text/javascript"> 
$(document).ready(function() { 
    for ($i=1; $i<10000; $i++) { 
     $('table').append("<tr id=\"test_" + $i + "\"><td>test " + $i + "</td></tr>"); 
     $('#test_'+($i-1)).remove(); 
    } 
}); 
</script> 
<table> 
    <tr><td id="test_0">test 0</td></tr> 
</table> 

tôi đã làm biến thể trên remove() bằng cách sử dụng:

var test = $('#test_'+($i-1)).remove(); 

và với delete operator (nhờ gợi ý tvanfosson của):

var test = $('#test_'+($i-1)).remove(); 
delete test 

Sau khi thực hiện các thử nghiệm này tôi sẽ vẫn chỉ cần sử dụng remove(). Nó rất khó để biết nếu có một rò rỉ bộ nhớ kể từ khi sử dụng bộ nhớ của trình duyệt luôn tăng lên sau khi tải lại trang. Có lẽ một người khác có thể cung cấp một câu trả lời kết luận hơn bằng cách kiểm tra mã khác nhau.

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