"JScript - Skriptblock" und Speicherlecks - Wie kann man Ressourcen freisetzen?

8

Ich habe einige Jquery-Tabs in eine Teilansicht meines Projekts eingefügt. Ich habe durch den "Lösungs-Explorer" von Visual Studio festgestellt, dass beim Debuggen jedes Mal, wenn ich auf einen neuen Tab klicke, ein neuer dynamischer JScript - script block generiert wird.

Das passiert sogar, wenn ich $('#mytabs .ui-tabs-hide').children().remove(); und $(".ui-tabs-hide").empty(); in show event der Registerkarten setze. Skriptblöcke enthalten Javascript, das ich in die Teilansichten lege, die durch Tabulatoren aufgerufen werden, also Jedes Mal, wenn ich auf eine zuvor angeklickte Registerkarte klicke, erscheint ein neuer JScript-Block. Es ist offensichtlich, dass dies zu Stabilitätsproblemen oder Speicherlecks führt ... zum Beispiel habe ich bereits bemerkt, dass einige Timer und Bindungen nicht richtig funktionieren, nachdem ich zweimal einen Tab geladen habe.

Ich weiß nicht, ob das Problem durch die Art und Weise verursacht wird, in der die Teilansichten aufgerufen werden, die die Skripte enthalten. Bitte sei vorsichtig, wie ich die Controller-Aktionen einstelle (Index im Beispiel).

Dies ist meine Umgebung: jquery 1.6.4 - jquery-ui 1.8.16 - IE 8.0.7601 Es kann mir nicht gelingen, mit anderen Browsern zu debuggen, da Visual Studio ihre Prozesse nicht anzuhängen scheint und keine dynamischen Daten anzeigt ...

CONTROLLER

Hier ist ein Aktionsbeispiel, das über die Registerkarten

aufgerufen wird %Vor%

Hier sind einige Teile meiner Ansichten und Skripte:

_Layout.cshtml

%Vor%

_TabsMenu.cshtml (Teilansicht mit dem Tab-Menü)

%Vor%

(Ich habe sogar versucht, das Skript in div id zu setzen, Pheraps ist albern, aber ich wollte sehen, ob das Skript im DOM entfernt wurde ... aber nichts)

Index.cshtml

%Vor%

_Index.cshtml (Teilansicht, die das wiederholte jscript-Objekt der Frage enthält)

%Vor%

Aktualisiert

JScript - Skriptblock 1..N // das sehe ich in jedem JScript - Skriptblock, während des Debuggens ... Ich bin testint jqgrid. Dies ist eine Demo von Trirands Website .

%Vor%     
Larry 20.02.2012, 16:53
quelle

3 Antworten

8

Skript, das von einem Browser analysiert wird, befindet sich nicht im DOM, und Sie können es nicht "entfernen" - Variablen sind noch definiert, Ereignisse sind immer noch gebunden, Methoden sind immer noch da. Wenn Sie JavaScript in eine Teilansicht einfügen, die Sie wiederholt laden, erhalten Sie das Javascript wiederholt.

Was Sie tun müssen, ist Ihr Javascript zu schreiben, um widerstandsfähiger zu sein. Wenn Sie Ereignisse an Elemente außerhalb des dynamischen Bereichs binden, tun Sie dies nicht. Du wirst sie mehrere Male binden. Verschieben Sie diesen Code irgendwo, es wird nur einmal geladen. Versuchen Sie, das Javascript im dynamischen Bereich isoliert zu halten, so dass es sich nur um Elemente handelt, die sich auch im dynamischen Bereich befinden.

Sie können sich auch gegen mehrere Definitionen schützen, indem Sie einfache if-Checks verwenden, jQuery-Selektoren verwenden, die mehr Bereiche enthalten, usw.

Ohne die Details dessen, was in diesem wiederholten Block ist, kann ich nicht viel anbieten.

    
bhamlin 27.02.2012 23:38
quelle
3

Es scheint mir, als ob Ihr Problem darin besteht, dass jedes Mal, wenn Sie einen Tab laden, auch alle darin enthaltenen Skripte geladen werden, und soweit es mich betrifft, können Sie nichts dagegen tun. Denken Sie daran, dass Sie es verwenden können Server-seitiger Code, um diese Skripte zu generieren, so dass ASP.NET sich so verhalten muss, als ob sie alle unterschiedlich wären (da sie tatsächlich funktionieren können).

JavaScript ist jedoch Müll gesammelt, so dass ich glaube nicht, dass diese Skripts tatsächlich Benutzerspeicher aufnehmen, wenn Sie nicht debuggen, der Debugger wird immer zeigen, dass alles geladen wurde, unabhängig davon, ob es Müll gesammelt wurde oder nicht (obwohl Ich habe es nicht wirklich getestet).

Wenn Sie sich Sorgen um den Speicher machen, stellen Sie sicher, dass Sie keine globalen Funktionen und Variablen deklarieren, die niemals Garbage Collected sein werden (speziell in Scopes, die neu geladen werden), um sie einfach mit einem

zu umgeben

(Funktion () {

und ein

}) ();

So dass sie sich in einer anonymen Funktion befinden, die direkt nach der Ausführung des Garbage Collections gesammelt werden kann.

    
Eduardo Wada 04.03.2012 03:40
quelle
2

Sie müssen nur alle Skripts auf den Registerkarten im Dokumentbereitschafts-Ereignis sammeln. Der folgende Code findet alle Script-Kinder eines Elements, führt sie aus und zerstört sie dann, so dass sie nicht mehr ausgeführt werden können:

%Vor%     
Francesco Abbruzzese 03.03.2012 23:42
quelle