La meilleure solution est pour vous de déployer votre propre méthode qui gère la gestion des événements. Par conséquent, lorsque vous attachez un gestionnaire d'événements, votre méthode peut garder une trace de tous les événements ajoutés. Au déchargement, il peut annuler l'inscription de tous les gestionnaires. Je sais que vous avez dit que vous n'utilisez pas de bibliothèques, mais vous pouvez utiliser leur code comme source d'inspiration. Ext-js le fait lorsque vous utilisez Ext.EventMgr.addListener.
Voici un obj EvtMgr simple que vous pouvez utiliser pour commencer. C'est très simpliste, je ne peux pas tout écrire pour vous ici. N'hésitez pas à poser des questions sur les choses que vous aimeriez et ne savent pas faire. Notez également que je n'utiliserais pas la méthode element.onclick car vous ne pouvez ajouter qu'un seul gestionnaire. Je le fais de cette façon parce que vous avez dit que c'est comme ça que vous le faites.
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;
}
}
}
}
})();
Aussi, méfiez-vous que les gestionnaires avec les fermetures ne sont pas la seule façon de créer des fuites.Voir mon commentaire sur cette question Javascript memory leaks after unloading a web page
Aussi, je ne comprends pas pourquoi certaines personnes ont peur des bibliothèques. jquery est minuscule, le noyau ext est aussi. Ils peuvent être dangereux si vous les utilisez sans comprendre js. Mais si vos compétences js sont solides, vous économisez beaucoup de travail en réutilisant leur code. Je suis sous le capot d'ext-js tous les jours quand j'ai besoin de comprendre comment quelque chose est fait. C'est ainsi que je vous ai donné ces quelques lignes de code.
Un autre point à considérer lors de la gestion des fuites de mémoire est de vous assurer de supprimer les gestionnaires lors de la suppression d'éléments du DOM (node.innerHTML ou de toute autre manière). Si vous faites cela, vous devez supprimer les gestionnaires des nœuds que vous avez supprimés du DOM. Il y a du travail pour que cela fonctionne, mais cela devrait faire partie de votre stratégie.
désolé, non! Il y a deux GC (javascript et DOM). Travailler indépendamment. Si vous connectez des objets javascript et DOM (nous le faisons tout le temps), une fuite se produit. – pkario