2012-06-14 21 views
7

Wenn Sie ein neues Image-Element in JavaScript erstellen, wird es im Google Chrome-Tool (Developer Tools> Zeitleiste> Arbeitsspeicher) natürlich als neues DOM-Element betrachtet.Ein Bildobjekt entsorgen

In meinem Fall habe ich am Ende 1500+ DOM-Elemente, und ich möchte sie loswerden. Ich habe versucht, alle Objekte in einem Array zu speichern und alle von ihnen in einer Schleife zu löschen, wenn ich bereit bin, alle Objekte zu schaffen, die sie in dem folgenden Fehler:

Uncaught TypeError: Cannot call method 'removeChild' of null

, dass die Bildobjekte zeigt nicht erscheinen im aktuellen DOM.

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 
} 

Gibt es eine Möglichkeit zum Entfernen/Löschen/ungesetzt/die Bildobjekte entsorgen?

Antwort

9

images = null einstellen würde Ihre Referenz in Code zu dem Objekt entfernen. Um das Ereignis load zu implementieren, muss Chrome jedoch eine eigene interne Referenz auf das Objekt haben.

Das heißt, könnten Sie Code wie dieses:

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

diese Weise können Sie immer noch eine Menge von „Test“ Warnungen bekommen würde, auch wenn Sie keinen Verweis auf diese Objekte.

Daher meine erraten ist, dass es ein Fehler in Chrome ist, nicht in Ihrem Code.

Update: Art durch die Chromquelle suchen beweist, dass (ich den Kommentar auf Zeilen 67-71 diese Datei bedeuten, vor allem der FIXME Note 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

danke! Ich weiß, dass deine Antwort zuletzt war, aber du hast tatsächlich etwas recherchiert. –

+0

Wurde das seither behoben oder ist das immer noch ein Fehler? – Hackeron

6

Wenn Sie sie nicht zum DOM hinzufügen (wie appendChild zu einem Elternteil verwenden), dann ist removeChild nutzlos. Die Bildobjekte sind nur im Speicher vorhanden.

Und um Elemente im Speicher zu entfernen, müssen Sie nur Verweise auf diese Objekte entfernen (z. B. die referenzierende Variable auf null setzen), und die Garbage Collection erledigt den Rest. Wenn Sie sie nicht alle vernichten können, werden sie nicht gecallt.

+0

Beste Antwort imo – sidonaldson

+0

Einfach nur neugierig, wenn Sie das Objekt null wird, dass noch technisch die vom 'image' zugewiesenen Speicher entfernen, nachdem GC'd zu sein? –

1

Ich denke, nur so ist dies zu tun:

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

// or just 
images = null; 
2

AFAIK, null zuweisen sollte es aufzuräumen: images[i] = null

2

Um die Wanze loszuwerden beschrieben von "Naivisten" aus Chrom und specilly IE und EDGE. Sie können die Bildquelle in leer ändern, so dass kein Speicher belegt wird.

image.src = ''; 
image = null;