При регистрации события через addEventListener
на элементе затем удалите тот элемент, не удаляя событие, и делая так неоднократно, память была бы "пропущена"?
Не должно протекать. Единственный браузер, который печально известен тем, что адски просачивается, когда обработчик событий вызывает цикл host-object <> JS-object, - это IE (до версии 7), а IE (до версии 8) не поддерживает addEventListener
.
Оставьте это включенным и посмотрите, как в долгосрочной перспективе повлияет использование памяти браузером, если вы хотите протестировать его в конкретном браузере.
<div id="x"></div>
<script type="text/javascript">
function replace() {
var x= document.getElementById('x');
if (x.firstChild!==null)
x.removeChild(x.firstChild);
var el= document.createElement('p');
el.addEventListener('click', click, false);
x.appendChild(el);
}
function click() {
alert('click');
};
setInterval(replace, 1);
</script>
(Чтобы проверить это с присутствующим эталонным циклом, переместите определение функции щелчок
вверх в тело replace
.)
Вы получите утечку памяти, если удалите из DOM элементы, к которым прикреплены слушатели. Но это происходит только в IE, Fx и других имеют расширенный GC.
Часто это происходит, если вы манипулируете элементами DOM не через DOM, а как
el.innerHTML = ...
Например, YUI имеет настраиваемую реализацию setInnerHTML, чтобы предотвратить утечку памяти в этом случае.