最善の解決策は、イベント処理を管理する独自のメソッドを展開することです。したがって、イベント ハンドラーをアタッチすると、メソッドは追加されたすべてのイベントを追跡できます。アンロード時に、すべてのハンドラーを登録解除できます。
ライブラリを使用しないと言ったのは知っていますが、それらのコードをインスピレーションとして使用できます。Ext.EventMgr.addListener を使用すると、Ext-js がそれを行います。
開始するために使用できる単純な EvtMgr obj を次に示します。非常に単純なので、ここにすべてを書ききることはできません。やりたいことやわからないことなど、気軽に質問してください。また、追加できるハンドラーは 1 つだけなので、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;
}
}
}
}
})();
また、クロージャーを持つハンドラーがリークを作成する唯一の方法ではないことに注意してください。この質問に対する私のコメントを参照してくださいWeb ページのアンロード後に Javascript メモリ リークが発生する
また、一部の人々が図書館を恐れている理由がわかりません。jquery は非常に小さく、ext コアも同様です。js を理解していない状態で使用すると危険です。しかし、js のスキルがしっかりしている場合は、コードを再利用することで多くの作業を節約できます。何かがどのように行われるかを理解する必要があるとき、私は毎日 ext-js の内部に入ります。これが、これらの数行のコードを提供した方法です。
メモリ リークを管理するときに考慮すべきもう 1 つの考えは、DOM から要素を削除するとき (node.innerHTML またはその他の方法) にハンドラーを削除することです。その場合、DOM から削除したノードからハンドラを削除する必要があります。それを機能させるにはいくつかの作業がありますが、それはあなたの戦略の一部であるべきです.