2014-12-18 4 views
3

Я регистрирую прослушиватель кликов на элементе DOM через jQuery.on(). Если позже этот элемент будет удален из DOM - возможно, косвенно, например. путем замены содержимого какого-либо родителя с помощью $(parent).html(...), должен ли я по-прежнему беспокоиться об удалении моего обработчика через jQuery.off()?Должен ли я вызвать jQuery.off после удаления элемента DOM?

Даже если элемент больше не будет запускать какое-либо событие, я беспокоюсь о потенциальных утечках памяти. Поддерживает ли jQuery или браузер уход и отбрасывает все зарегистрированные обработчики после удаления элемента из DOM?

ответ

5

Даже если элемент больше не будет запускать какое-либо событие, я беспокоюсь о потенциальных утечках памяти.

Это очень хорошая забота. Чтобы ответить на ваш вопрос, взгляните на $.fn.htmlimplementation. Оттуда вы узнаете, что html попытается очистить сохраненные данные о событии:

// Remove element nodes and prevent memory leaks 
if (elem.nodeType === 1) { 
    jQuery.cleanData(getAll(elem, false)); 
    elem.innerHTML = value; 
} 

Так что в этом случае вручную вызывающий .off() не является необходимым. Однако ...

Необходимо помнить, что вы никогда не должны пытаться удалить элементы с помощью собственных методов, например removeChild, или установить innerHTML, так как в этом случае наверняка будет утечка памяти (если некоторые данные сохранены, события зарегистрированный jQuery и т. д.). В этом случае более надежно отменять регистрацию обработчиков событий с помощью метода .off. Или лучше использовать распространение событий и вместо этого или html('') использовать $.fn.remove.

+0

Но почему браузер хранит их в памяти? зачем нам их явно удалять? –

+2

@SubinJacob Поскольку jQuery хранит данные 'data' и' event' в промежуточном объекте. Если элементы удалены из DOM, может случиться, что связанные данные будут сохранены во внутреннем кеше (например, вы связываете событие с '.on', а затем удаляете элемент с' removeChild' или 'innerHTML = ''' на родительском элементе. jQuery 'html ('')', 'empty()', 'remove()' и т. д. не забудьте удалить соответствующие элементы данных из кеша. – dfsq

+0

Ох уж это. Тогда это связано только с jQuery, а не с браузером, правильно? Было бы неплохо, если бы мы связали событие с использованием чистой ванильной js. –

0

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

Смежные вопросы