Предположим, что у меня есть страница с раскладкой из двух столбцов, где левый столбец представляет собой набор ссылок, и он загружает связанную html-страницу/шаблон в правый столбец при нажатии этой ссылки.События и элементы DOM
При загрузке шаблона есть обработчик шаблон, который инициализируется как одноточечного через requirejs и определяет некоторые методы и обработчики, как:
SomePage.prototype.saveHandler: function(e) { ... }; // Page handler has a handler
SomePage.prototype.initialize: function() {
$('#btnSave').on('click', saveHandler);
}
Тогда я прикрепление события DOM через метод инициализации каждого время загрузки страницы.
SomePage.initialize(); // This attaches the click event
Теперь, когда я нажимаю другую ссылку на левой стороне, другой шаблон страницы загружается и выше процесс повторяется для этой страницы.
Мне интересно, что происходит с событием клика, которое ранее было прикреплено к элементу btnSave? Является ли это теперь зависающим обработчиком событий в кеше jQuery?
Если я попытаюсь удалить его, когда одна и та же страница загрузится снова, действительно ли она удалит исходное событие?
$('#btnSave').off('click', saveHandler);
Выполняет ли следующий блок предотвращение утечки памяти/оборванных ссылок?
// The potential problem here is that btnSave is part of the newly loaded template
// and not the element i attached the handler to earlier (which doesn't exist anymore)
$('#btnSave').off('click', saveHandler);
$('#btnSave').on('click', saveHandler);
Каков наилучший способ гарантировать, что я не получаю оборванных ссылок и утечек памяти. Это потенциальный вопрос для простого javascript. Я понимаю, что приведенное выше не будет работать, когда страница шаблона будет обновлена. Я собираюсь экспериментировать с ним в то же время, но было бы неплохо узнать, как это делают специалисты. Благодаря!
Я определенно использую 'off', а затем' on' справа после этого, как и вы. Но есть ли какой-либо возможный способ вызывать 'off' * before *, вы перезагружаете шаблон? – dthree
Я думал об этом шаблоне в качестве решения, но я не уверен, что мне это нужно, поскольку jQuery может обрабатывать его внутренне.Если каждая страница реализовала интерфейс и после загрузки зарегистрировала себя как текущую страницу, тогда глобальный обработчик ссылок мог бы сделать что-то вроде app.cache.currentPage.cleanup(), в котором могли бы быть все пропуски. – theoutlander
Я думаю, что вы правы в том, что он создает элемент-призрак, не делая этого ... – dthree