2011-03-04 21 views

Respuesta

14

El método removeChild simplemente lo elimina de su matriz. Si es un elemento visible de la página, se eliminará de la página.

Pero Javascript tiene recolección de basura. Esto significa que el objeto nodo en sí mismo seguirá existiendo mientras se refiera a cualquier variable. Para que pueda asignar un nodo a una variable, use removeChild para 'cortarlo' de su nodo padre, y luego, insertarlo o anexarlo a otro nodo, moviéndolo efectivamente por la página.

El siguiente código eliminar un nodo, y espere 10 segundos antes de volver a agregarlo al árbol (y por lo tanto, a la página):

var oldNode = someNode.removeChild(...); 
setTimeout(function() { 
    document.documentElement.appendChild(oldNode); 
}, 10000); 

Esto significa que el objeto de nodo no ha sido borrado de la memoria, porque todavía hay una variable que lo señala (es decir, oldNode).

Otro caso:

var node = document.getElementById('test'); 
// ... do stuff 
node.parentElement.removeChild(node); 
// 'node' still exists, but has been removed from the page 
// ... do some more stuff 
node = document.getElementById('hello'); 
// The variable 'node' now points to something else; 
// this means the original node will be deleted from memory 

Si, por el contrario, se No reasignar el nodo eliminado a otra variable, que no se puede acceder más (no a través de la estructura del documento, ya ha sido eliminado de allí, y no a través de una variable JS); así Javascript purgará automáticamente de la memoria:

someNode.removeChild(...); 

Asignación del nodo eliminado a una variable, y luego asignar null (o cualquier otra cosa) a esa variable - como Marc B sugiere en su respuesta - es completamente innecesario y, En mi humilde opinión.

1

removeChild elimina el elemento del dom, pero también se devuelve de la función en caso de que esté realizando la eliminación para volver a insertarlo en otro lugar. Habría que matar a ese valor de retorno para conseguir realmente deshacerse del nodo eliminado:

oldNode = someNode.removeChild(...); 
oldNode = null; 
+0

Oh gracias :) –

+5

¿No sería simplemente no asignar el valor de retorno a algo que tenga el mismo efecto? – awm

+1

Null es conveniente y lo hace obvio que está destruyendo el valor. haciendo 'oldNode = 'eliminar este nodo, por favor';' parece un desperdicio de caracteres. –

10

Esto eliminará completamente el nodo:

someNode.removeChild(...); 

Esto eliminará el nodo desde el DOM así que no es visible pero la salvará de manera que se puede insertar en otra parte:

oldNode = someNode.removeChild(...); 
+1

El primer ejemplo es correcto, pero tuve una situación en la que no parecía funcionar, p.'var aChild = document.createElement (...); someNode.appendChild (aChild); ... someNode.removeChild (aChild); 'El nodo permanece debido a la referencia de la variable aChild. En ese caso, debe 'eliminar un niño' para completar el trabajo. – CyberFonic

+0

Desde otro contexto (donde puede que no sepa si hay otras referencias al nodo eliminado), puede verificar para ver en qué estado se encuentra el nodo eliminado con 'node.parentElement == null' –

+0

Esto no tiene en cuenta otras referencias al nodo. Es decir, si se hace referencia al nodo en otro lugar, 'removeChild' no eliminará completamente el nodo. –

1

Si realmente quiere eliminar un elemento dom. removeChild solo no es suficiente. Esto es como Steve Sounders, que es el autor de YSlow. Necesita utilizar eliminar

Cuestiones relacionadas