2009-06-27 11 views
7

Acabo de descubrir que cuando se usa la función remove(), los elementos coincidentes no se eliminan del objeto jQuery, solo el DOM.

Según la remove() documentation:

Elimina todos los elementos emparejados de la DOM. Esto NO los elimina del el objeto jQuery, lo que le permite usar más los elementos coincidentes.

Seguramente si una aplicación web sigue agregando y eliminando elementos de la dom, esto seguirá consumiendo más y más memoria? ¿Alguien puede confirmar si este es el caso? ¿Qué se puede hacer para evitar esto?

Respuesta

7

Creo que sería basura recogida (con el tiempo) una vez que cae fuera del ámbito. Si tiene problemas con el uso excesivo de memoria, aunque puede intentar usar el operador delete en el objeto devuelto.

+0

Sí. El DOM está alterado pero el objeto jQuery no. Si asignó el objeto jQuery a una variable, el recolector de basura debería tener una oportunidad de esa variable cuando se sale del alcance. – Nosredna

2

He intentado encontrar la respuesta a mi propia pregunta haciendo una pequeña prueba.

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

lo hice variaciones sobre el remove() mediante el uso de:

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

y con las delete operator (gracias a la sugerencia de tvanfosson):

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

Habiendo hecho estas pruebas lo haría todavía solo usa quitar(). Es muy difícil saber si hubo una pérdida de memoria ya que el uso de la memoria del navegador siempre aumentó después de volver a cargar la página. Tal vez alguien más pueda dar una respuesta más concluyente al probar el código de manera diferente.

Cuestiones relacionadas