2009-06-27 19 views
7

Ho appena scoperto che quando viene utilizzata la funzione remove(), gli elementi corrispondenti non vengono rimossi dall'oggetto jQuery, ma solo dal DOM.

Secondo il remove() documentation:

rimuove tutti gli elementi corrispondenti dalla DOM. Questo NON li rimuove da l'oggetto jQuery, consentendo di utilizzare ulteriormente gli elementi corrispondenti .

Sicuramente se un'app Web continua ad aggiungere e rimuovere elementi dal dom, questo continuerà a consumare sempre più memoria? Qualcuno può confermare se questo è il caso? Cosa si può fare per evitare questo?

risposta

7

penso che sarebbe garbage collection (eventualmente) una volta che si rientra nell'ambito. Se si verificano problemi con un uso eccessivo della memoria, si potrebbe provare a utilizzare l'operatore delete sull'oggetto restituito.

+0

Sì. Il DOM viene modificato ma l'oggetto jQuery non lo è. Se hai assegnato l'oggetto jQuery a una variabile, il garbage collector dovrebbe avere uno scatto su quella variabile quando non rientra nell'ambito. – Nosredna

2

Ho provato a trovare la risposta alla mia domanda facendo un piccolo test.

<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> 

ho fatto variazioni sul remove() utilizzando:

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

e con le delete operator (grazie al suggerimento di tvanfosson):

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

aver fatto questi test lo farei ancora basta usare remove(). È molto difficile dire se ci fosse una perdita di memoria poiché l'utilizzo della memoria del browser aumentava sempre dopo aver ricaricato la pagina. Forse qualcun altro è in grado di fornire una risposta più conclusiva testando il codice in modo diverso.