Я вижу, что обработчики событий, зарегистрированные через .on()
, хранятся в $.cache
. Я также вижу, что обработчики событий также хранятся в $(elem).data()
.
Объекты, хранящиеся в $.cache
, относятся к узлам DOM, на которых зарегистрированы события. Это приводит к утечке памяти при отсоединении узлов DOM, и это делает обязательными .off()
.
У меня есть ситуация, когда я не знаю, когда узел DOM (к которому я привязал обработчик события) отсоединяется. Хотя я могу хранить ссылку на этот узел DOM в своем коде и вызывать .off()
для очистки, это не кажется приятным, потому что не просто знать, когда удаляется узел DOM.
Каков наилучший способ для этого?
1. Если отношение между элементом и обработчиками поддерживается через серийный номер (и если обработчик не относится к элементу), я не вижу причин, по которым записи .cache должны приводить к памяти протечь. По какой-то причине я не знаю, насколько это оправдано, запись в кэш относится к элементу. Мне любопытно узнать, почему требуется ссылка на элемент. 2. Мне не известны случаи, когда expando элемента не может напрямую ссылаться на объекты (обработчики). Если expando может содержать ссылки, я не вижу необходимости в параллельной структуре, например .cache, для хранения ссылок. – user968903
@ user968903: 1. Они приводят к утечкам, если вы не используете методы jQuery, которые удаляют связанную запись '.cache' при удалении элемента. Серийный номер является единственным соединением между ними, поэтому, если элемент с последовательным '123' удален, но jQuery не удаляет запись' 123' в '$ .cache', то эта запись теперь ссылается на данные, которые больше не имеет соответствующий элемент и никогда не будет очищен. Обоснованием были потенциальные утечки памяти, которые существуют прежде всего в IE6 и, возможно, в IE7. Теперь, когда эти браузеры почти исчезли, я не знаю, хорошо ли этот подход. –
@ user968903: 2. Я думаю, что современные браузеры обычно очищают элементы при удалении, поэтому, вероятно, это уже не проблема. Я считаю, что в первую очередь были проблемы с IE6/7. Я думаю, что все еще могут быть потенциальные утечки памяти в отношении замыканий, когда у элемента есть обработчик, который имеет в своей переменной область круговую ссылку на себя, но я не уверен, что это проблема сегодня или нет. Я посмотрю, что я могу найти. –