Утечка памяти плагина

Эти строки в плагине загрузочного аффикса, похоже, вызывают утечку памяти, потому что окно получает ссылку на экземпляр аффикса, который никогда не выпускался.

В качестве обходного пути я использую этот код для освобождения ссылок при удалении прикрепленного элемента из DOM:

$(window)
    .off('scroll.bs.affix.data-api')
    .off('click.bs.affix.data-api');

Кажется, что это взломанный - есть ли лучший способ сделать это? Не видел ничего в прикреплять плагины.

Ответы

Ответ 1

Я принял рекомендацию @Carrie Kendall и открыл отчет об ошибке... хорошо прокомментировал соответствующий отчет об ошибке.

https://github.com/twbs/bootstrap/issues/13655

В этом случае нам нужен метод "destroy" для плагина affix и некоторая документация на сайте getbootstrap, чтобы люди, использующие плагин affix в приложениях с одной страницей, могли избежать потери памяти при удалении их прикрепленного содержимого.

Ответ 2

По умолчанию bootstrap Affix прослушивает события scroll и click на $(window), используя пространства имен .bs, .affix и .data-api.

$.off('.affix'); удалит всех слушателей в пространстве имен .affix. $(window).off('.affix'); удалит всех слушателей в пространстве имен .affix из элемента window. Если у вас есть только один Affix и прикрепляют его к окну, он имеет тот же эффект, что и $.off('.affix');

Добавление в другие пространства имен делает его более конкретным, но если вы не используете пространство имен .affix в своем собственном коде, добавленная специфика ничего не меняет. Вы не хотите удалять другие пространства имен независимо от .affix, если вы используете какие-либо другие элементы начальной загрузки.

$('.affix').off('.affix'); не будет работать, потому что слушатели не находятся в элементе Affixed, а на объекте, к которому прикреплен элемент, то есть к окну.

pstenstrm правильно, что нет способа обнаружить, что элемент удаляется из DOM или вводится в этом отношении. Поэтому, если код позже повторно вводит элемент, и вы хотите снова вести себя как Affix, вам нужно будет использовать bootstrap JS api, чтобы снова вызвать Affix.

Ответ 3

Невозможно обнаружить, когда элемент удален из DOM. Плагин аффикса не может автоматически удалить слушателей. То, как вы это делаете, - это правильный путь.

Хотя, вызывая $(window).off(), вы удаляете каждого слушателя, даже те, которые вы, возможно, захотите сохранить. Было бы безопаснее только вызывать $.off() для элемента, который вы удаляете.

$('.affix').off('.affix');

.bs, .affix и .data-api после имени события являются пространствами имен. Вызывая $.off('.affix'), вы удаляете каждое событие, объявленное в этом пространстве имен. Скорее всего, лучше всего делать то, что вы делаете.