JQuery пустые отсоединенные слушатели, присоединенные через addEventListener? - PullRequest
0 голосов
/ 18 марта 2019

Метод jQuery .empty () удаляет прослушиватели, подключенные через

var e = () => { ... };
element.addEventListener('click', e);

или только те, которые прикреплены через

var e = () => { ... };
$(element).on('click', e);

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

  • либо нужно удалить каждого слушателя из каждого узла, который я хотел бы удалить вручную, используя removeEventListener ()
  • или использовать библиотеку типа jQuery для добавления и удаления прослушивателей, используя .on () и .empty () соответственно?

Насколько я понял этот вопрос , динамическое добавление и удаление элементов, имеющих прослушиватели событий, не очищает все ссылки и, следовательно, заставляет эти элементы оставаться в памяти.

var element = document.createElement('div');
var handler = function() {
    alert('foo');
};

document.body.appendChild(element);

// Option 1
element.addEventListener('click', handler);
document.body.innerHTML = '';

// Option 2
element.addEventListener('click', handler);
$(document.body).empty();

// Option 3
$(element).on('click', handler);
$(document.body).empty();

Какая опция полностью удаляет элемент не только из DOM, но и полностью освобождает его память? Использование removeEventListener, к сожалению, для меня нецелесообразно ...

1 Ответ

0 голосов
/ 18 марта 2019

empty() удаляет дочерние элементы из родительского (ых).Любые прослушиватели событий, прикрепленные к элементам, больше не будут существовать, так как дочерние элементы больше не будут существовать.

Также: https://api.jquery.com/empty

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

Если вы хотите удалить элементы, не уничтожая их данные или обработчики событий (чтобы их можно было добавить позже), используйте .detach ()вместо этого.

jQuery также очищает после себя, если знает, что элементы уничтожаются.

Однако, ни одно из этого не гарантирует, что в вашем javascript все еще нет переменных ссылок на элементы, что приведет к тому, что они не будут собирать мусор.Ни empty(), ни удаление самих слушателей событий не приведет к тому, что сам элемент будет собирать мусор.Вы должны убедиться, что в вашей логике больше нет ссылок на удаляемые элементы.

...