Лучшее решение для вас - развернуть свой собственный метод, который управляет обработкой событий. Поэтому при подключении обработчика событий ваш метод может отслеживать все добавленные события. При выгрузке может отменить регистрацию всех обработчиков.
Я знаю, что вы сказали, что не используете библиотеки, но вы можете использовать их код для вдохновения. Ext-js делает это, когда вы используете Ext.EventMgr.addListener.
Вот простой объект EvtMgr, который вы можете использовать, чтобы начать. Это очень упрощенно, я не могу написать все это для вас здесь. Не стесняйтесь задавать вопросы о вещах, которые вам нравятся, и не знаете, как это сделать. Также обратите внимание, что я не буду использовать метод element.onclick, так как вы можете добавить только один обработчик. Я так делаю, потому что ты сказал, что так ты и делаешь.
var EvtMgr = (function(){
var listenerMap = {};
// Public interface
return {
addListener: function (evtName, node, handler) {
node["on" + evtName] = handler;
var eventList = listenerMap[evtName];
if (!eventList) {
eventList = listenerMap[evtName] = [];
}
eventList.push(node);
},
removeAllListeners: function() {
for (var evtName in listenerMap) {
var nodeList = listenerMap[evtName];
for (var i=0, node; node = nodeList[i]; i++) {
node["on" + evtName] = null;
}
}
}
}
})();
Кроме того, помните, что обработчики с замыканиями - не единственный способ создавать утечки. См. Мой комментарий к этому вопросу Утечки памяти Javascript после выгрузки веб-страницы
Кроме того, я не понимаю, почему некоторые люди боятся библиотек. JQuery крошечный, Ext Core тоже. Они могут быть опасны, если вы используете их без понимания js. Но если вы обладаете хорошими навыками js, вы экономите много работы, повторно используя их код. Я попадаю под капот ext-js каждый божий день, когда мне нужно понять, как что-то делается. Вот как я дал вам эти несколько строк кода.
Еще одна мысль, о которой следует подумать при управлении утечками памяти, - убедиться, что вы удаляете обработчики при удалении элементов из DOM (node.innerHTML или любым другим способом). Если вы сделаете это, вы должны удалить обработчики с узлов, которые вы удалили из DOM. Есть некоторая работа, чтобы заставить это работать, но это должно быть частью вашей стратегии.