2012-06-14 2 views
7

При создании нового элемента изображения в javascript инструмент памяти Google Chrome (инструменты разработчика> Временная шкала> Память), естественно, рассматривает его как новый элемент DOM.Утилита объекта изображения

В моем случае я получаю 1500 элементов DOM, и я хочу избавиться от них. Я пытался сохранить все объекты в массиве и удалить все из них в цикле, когда я готов создать все объекты, в результате следующей ошибки:

Uncaught TypeError: Cannot call method 'removeChild' of null

Это указывает на объекты изображения не отображаются в фактической 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 
} 

Есть ли способ, чтобы удалить/удалить/снятие/отчуждать объекты изображения?

ответ

9

Установка images = null будет удалить ссылку в коде объекта. Однако для реализации своего события load Chrome должен иметь собственную внутреннюю ссылку на объект.

То есть, вы могли бы иметь такой код:

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

Таким образом, вы все равно получите много «тест» предупреждает, даже если у вас нет ссылки на эти объекты.

Следовательно, мой догадка заключается в том, что это ошибка в Chrome, а не в вашем коде.

Update: глядя через источник хрома рода доказывает, что (я имею в виду комментарий по линии 67-71 этого файла, особенно FIXME примечание 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

спасибо! Я знаю, что ваш ответ был последним, но вы на самом деле сделали некоторые исследования. –

+0

Было ли это исправлено с тех пор, или это еще ошибка? – Hackeron

6

Если вы не добавляете их в DOM (например, используя appendChild родителям), то removeChild бесполезен. Объекты изображения находятся только в памяти.

И для удаления элементов в памяти вам нужно только удалить ссылки на эти объекты (например, установить для ссылочной переменной значение null), а сборка мусора сделает все остальное. Если вы не можете их обнулить, они не будут GC'ed.

+0

Лучший ответ имо – sidonaldson

+0

Просто интересно, если обнулить объект будет что технически все еще удалить память, выделенную из 'image' после того, как GC'd? –

1

Я думаю, что единственный способ это сделать это:

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

// or just 
images = null; 
2

AFAIK, назначая null должен очистить его: images[i] = null

2

Чтобы избавиться от ошибки, описанной «наивистами» хром и specilly IE и EDGE. Вы можете изменить источник изображения на пустой, чтобы он обрел нулевую память.

image.src = ''; 
image = null; 
Смежные вопросы