17

These lines в плагине bootstrap affix, похоже, вызывает утечку памяти, поскольку окно получает ссылку на экземпляр аффикса, который никогда не был выпущен.bootstrap affix plugin memory leak

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

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

КАЖЕТСЯ вид hacky- есть лучший способ сделать это? Ничего не видел в affix plugin docs.

+0

Кроме того, могу ли я спросить, почему вы удаляете встроенные ссылки, которые включены в BS3 по умолчанию? – Raptus

+0

Я не совсем понимаю, почему происходит утечка. Если возможно, можете ли вы его подробнее разобрать? Пример будет хорошим. Благодаря! –

ответ

1

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

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

Что нам нужно в этом случае является метод «уничтожение» для аффикса плагина и документация на сайте getbootstrap так, что люди, использующие аффикс плагина в отдельных приложениях страниц могут избежать ловушек утечки памяти при удаляя их прикрепленное содержимое.

0

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

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

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

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

+0

$ ('. Affix'). Off ('. Affix'); –

1

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

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

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

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

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