2012-06-14 26 views
7

Al crear un nuevo elemento de imagen en javascript, la herramienta de memoria de Google Chrome (Herramientas de desarrollador> Línea de tiempo> Memoria) lo considera como un nuevo elemento DOM, naturalmente.Eliminar un objeto de imagen

En mi caso, termino con más de 1500 elementos DOM, y deseo deshacerme de ellos. He tratado de guardar todos los objetos en una matriz y eliminar todos ellos en un bucle cuando esté lista la creación de todos los objetos, dando como resultado el siguiente error:

Uncaught TypeError: Cannot call method 'removeChild' of null

que indica los objetos imagen no aparecer en el DOM real.

var images = []; 
var i, image; 

for(i = 0; i < urls.length; i++) { 
    image = new Image(); 
    image.src = urls[i]; 
} 

// other stuff happens 

for(i = 0; i < images.length; i++) { 
    // apparently this doesn't work because I'm not adding the image to my DOM 
    // images[i].parentNode.removeChild(images[i]); 

    // delete images 
} 

¿Hay una manera de quitar/eliminar/desarmar/desechar los objetos de imagen?

Respuesta

9

Configuración images = null eliminaría su referencia en el código para el objeto. Sin embargo, para implementar su evento load, Chrome debe tener su propia referencia interna al objeto.

Es decir, usted podría tener un código como éste:

for(i = 0; i < urls.length; i++) { 
    image = new Image(); 
    image.src = urls[i]; 
    image.onload = function(){alert('Test');}; 
    image = null; 
} 

De esta manera usted todavía obtener una gran cantidad de alertas de "prueba", a pesar de que usted no tiene una referencia a estos objetos.

Por lo tanto, mi conjetura es que es un error en Chrome, no en su código.

Actualización: mirando a través de la fuente de cromo tipo de prueba que (me refiero al comentario de las líneas 67-71 de este archivo, especialmente la nota ARREGLAME http://code.google.com/searchframe#OAMlx_jo-ck/src/third_party/WebKit/Source/WebCore/bindings/v8/custom/V8HTMLImageElementConstructor.cpp):

// Make sure the document is added to the DOM Node map. Otherwise, the HTMLImageElement instance 
// may end up being the only node in the map and get garbage-ccollected prematurely. 
// FIXME: The correct way to do this would be to make HTMLImageElement derive from 
// ActiveDOMObject and use its interface to keep its wrapper alive. Then we would 
// remove this code and the special case in isObservableThroughDOM. 
+0

gracias! Sé que tu respuesta fue la última, pero en realidad has investigado –

+0

¿Se ha solucionado esto desde el principio o todavía es un error? – Hackeron

6

Si no los está agregando al DOM (como usar appendChild a un padre), entonces removeChild es inútil. Los objetos de imagen están solo en la memoria.

Y para disponer de elementos en la memoria, solo necesita eliminar las referencias a estos objetos (como establecer la variable de referencia en nulo), y la recolección de basura hará el resto. Si no puedes anularlos a todos, no serán eliminados por GC.

+0

Mejor respuesta imo – sidonaldson

+0

Sólo por curiosidad, si Null el objeto de que técnicamente quitar la memoria asignada desde el 'image' después de estar GC'd? –

1

creo que es única manera de hacer esto:

for(i = 0; i < images.length; i++) 
    images[i] = null; 
} 

// or just 
images = null; 
2

yo sepa, la asignación de null debe limpiarlo: images[i] = null

2

para deshacerse del error descrito por "naivistas" de Chrome y especialmente IE y EDGE. Puede cambiar el origen de la imagen a vacío para que no tenga memoria.

image.src = ''; 
image = null; 
Cuestiones relacionadas