утечки памяти addEventListener

При регистрации события через addEventListener на элементе затем удалите тот элемент, не удаляя событие, и делая так неоднократно, память была бы "пропущена"?

8
задан vsync 8 June 2018 в 09:24
поделиться

2 ответа

Не должно протекать. Единственный браузер, который печально известен тем, что адски просачивается, когда обработчик событий вызывает цикл 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 .)

5
ответ дан 5 December 2019 в 23:14
поделиться

Вы получите утечку памяти, если удалите из DOM элементы, к которым прикреплены слушатели. Но это происходит только в IE, Fx и других имеют расширенный GC.

Часто это происходит, если вы манипулируете элементами DOM не через DOM, а как

el.innerHTML = ...

Например, YUI имеет настраиваемую реализацию setInnerHTML, чтобы предотвратить утечку памяти в этом случае.

0
ответ дан 5 December 2019 в 23:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: