2009-05-15 3 views
0

Ein Code, mit dem ich arbeite, ersetzt einige HTML-Elemente, die Dojo-Ereignis-Listener mit neuem HTML-Code haben, der von einem AJAX-Aufruf stammt (mit .innerHTML =). Ich habe gelesen, dass Ereignis-Listener mit der Methode dojo.disconnect (handle) getrennt werden sollten, bevor sie ersetzt werden, um Speicherlecks zu verhindern.Ist es möglich, alle Ereignishandler in Dojo zu trennen?

Ist es möglich, alle mit einem bestimmten Element verbundenen Handles abzuleiten, sodass ich sie an .disconnect (handle) übergeben kann, oder liegt es an mir, diese Liste in meinem Code zu pflegen?

Antwort

5

Eigentlich, wenn Sie Widgets verwenden, sollten sie normalerweise Sachen in der Methode destroy() trennen. Wenn Sie die Knoten selbst behandeln, sehe ich zwei Möglichkeiten, wie Sie gehen können.

1) Verwalten Sie alle verbindet manuell, bedeutet, sie irgendwo zu speichern. 2) wohl ein sicherer: Speichern aller Verbindungs-Handler in dem Knoten sie zu verbinden, etwa so:

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

Und später können Sie einfach trennen sie alle, diese kann tatsächlich

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

mit funktionieren gut, aber es könnte einen effizienteren Weg geben, alle Verbindungen von Knoten zu erhalten. Ich habe es einfach nicht gefunden. hth

+0

danke, ich werde es ausprobieren! – AndreiM

+1

Da ich nicht erwarte, dass mein AJAX-Bereich mehr als eine Handvoll Event-Handler enthält, habe ich alle Handles für alle Knoten in einem Array in meinem Dojo-Modul gespeichert. Ich kann jedes Element an die Trennmethode übergeben, ohne über einen der Knoten auf meiner Seite zu iterieren. Es scheint einen Effekt darauf zu geben, wie viel Speicher FireFox benutzt, um AJAX-Aufrufe auszulösen. Danke nochmal für deine Hilfe! – AndreiM

+0

'dojo._connect_tmp = dojo.connect; dojo.connect = function (obj, Ereignis, Kontext, Methode dontFix) { if (obj._connectHandlers == undefined) {obj._connectHandlers =];} obj._connectHandlers.push (dojo._connect_tmp (obj, Ereignis , Kontext, Methode, dontFix)); }; dojo.iwanttobefree = function (obj) { ' if (obj._connectHandlers == undefined) {' } else { '' dojo.forEach (node._connectHandlers "dojo.disconnect (Punkt)"); } ' }; – Mahomedalid

1

Im Anschluss an die Antwort von Wolfram Kriesing kann diese "verbessert" werden:

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

Dann können Sie dies tun:

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

Ersetzen Dojo Code kann sehr sehr sehr hässlich aus mehreren Gründen Vielleicht möchten Sie Ihren eigenen Namespace erstellen.