2009-05-15 6 views
0

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

特定の要素に接続されているすべてのハンドルを派生させることができるので、それぞれを.disconnect(ハンドル)に渡すことができます。

答えて

5

実際にウィジェットを使用している場合、通常はtehir destroy()メソッドで接続を解除する必要があります。自分でノードを操作している場合は、2つの方法があります。

1)すべての接続を手動で管理する。つまり、どこかに格納することを意味します。 2)1おそらく、より安全:

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)"); 
    } 
}); 

を使用して、それらすべてを切断することができますので、同じように、彼らが接続するノード内のすべての接続ハンドラを保存しますうまく機能しますが、ノードごとにすべての接続を取得する効率的な方法があるかもしれません。私はそれを見つけられませんでした。

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)"); 
    } 
}; 

は、その後、あなたがこれを行うことができます:これは「改善」することができヴォルフラムKriesingの答えに続きHTH

+0

ありがとう、私はそれを試してみよう! – AndreiM

+1

私は、AJAXの領域に少数のイベントハンドラを含めるとは期待していないので、すべてのノードのハンドルをすべて1つの配列に格納することになりました。私は、各要素を私のページ上のどのノードでも反復処理することなく切断メソッドに渡すことができます。 FireFoxがAJAX呼び出しをトリガする際にどれくらいのメモリを使用しているかが影響しているようです。あなたの助けをもう一度ありがとう! – AndreiM

+0

'dojo._connect_tmp = dojo.connect; dojo.connect = function(obj、event、context、method、dontFix){ if(obj._connectHandlers == undefined){obj._connectHandlers =];} obj._connectHandlers.push(dojo._connect_tmp(obj、event 、コンテキスト、メソッド、dontFix)); }; dojo.iwanttobefree = function(obj){' if(obj._connectHandlers == undefined){' } else {' ' dojo.forEach(node._connectHandlers、 "dojo.disconnect(item)"); } ' }; – Mahomedalid

1

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

道場コードを交換すると、複数の理由のために非常に非常に非常に醜いことができます、あなた自身の名前空間を作成したいかもしれません。

関連する問題