0

私が作業している一部のコードは、Dojo イベント リスナーを持つ一部の HTML 要素を、AJAX 呼び出し (.innerHTML= を使用) からの新しい HTML に置き換えます。イベント リスナーは、メモリ リークを防ぐために交換する前に dojo.disconnect(handle) メソッドを使用して切断する必要があることを読みました。

特定の要素に接続されているすべてのハンドルを派生させて、それぞれを .disconnect(handle) に渡すことは可能ですか、それともコードでこのリストを維持するのは私次第ですか?

4

2 に答える 2

5

実際、ウィジェットを使用している場合は、通常、destroy() メソッドで切断する必要があります。ノードを自分で処理している場合は、2 つの方法があります。

1)すべての接続を手動で管理します。つまり、それらをどこかに保存します。2) おそらくより安全な方法: すべての接続ハンドラーを接続先のノードに格納します。次のようにします。

node._connectHandlers = [];
node._connectHandlers.push(dojo.connect(node, "onclick", ...));

そして後で、それらをすべて単純に切断することができます

dojo.query("*", nodeContainingConnects).forEach(function(node){
    if (typeof node._connectHandlers!="undefined"){
        dojo.forEach(node._connectHandlers, "dojo.disconnect(item)");
    }
});

実際、これはうまくいくかもしれませんが、ノードごとにすべての接続を取得するためのより効率的な方法があるかもしれません。私はそれを見つけませんでした。h番目

于 2009-05-15T21:03:34.347 に答える
1

Wolfram Kriesingの答えに従うと、これは「改善」される可能性があります。

dojo._connect_tmp = dojo.connect;
dojo.connect = function (obj, event, context, method, dontFix) {
    if(obj._connectHandlers == undefined){ obj._connectHandlers = [];}
    var handler = dojo._connect_tmp (obj, event, context, method, dontFix);
    obj._connectHandlers.push(handler);
    return handler;
};

dojo.iwanttobefree = function (obj) {
   if(obj._connectHandlers == undefined) {
   } else {
      dojo.forEach(obj._connectHandlers, "dojo.disconnect(item)");  
   }
};

次に、これを行うことができます:

dojo.connect(myObj, 'onfocus', function(){alert('weee')});
dojo.iwanttobefree(myObj);

dojoコードの置き換えは、さまざまな理由で非常に醜い場合があるため、独自の名前空間を作成することをお勧めします。

于 2011-09-08T21:41:41.957 に答える