Утечка памяти плагина
Эти строки в плагине загрузочного аффикса, похоже, вызывают утечку памяти, потому что окно получает ссылку на экземпляр аффикса, который никогда не выпускался.
В качестве обходного пути я использую этот код для освобождения ссылок при удалении прикрепленного элемента из 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')
, вы удаляете каждое событие, объявленное в этом пространстве имен. Скорее всего, лучше всего делать то, что вы делаете.