2013-03-14 15 views
5

Ich habe ein kleines Chat-Box-Widget geschrieben, das jede Sekunde einen Ajax-Aufruf ausführt, um neue Nachrichten abzurufen, die gepostet wurden. Das Problem ist, dass der Speicher ausgelaufen ist und nach nur 15 Minuten des Öffnens stürzt mein Browser (Firefox) ab.Speicherleck in jQuery AJAX Anrufe

Es ist wahrscheinlich mich, als ich ein relativer Neuling bin, und ich bin sicher, dass ich etwas aus oder bin nicht unsetting meine Variablen, etc ..

var chat = {} 
chat.fetchMessages = function() { 
    $.ajax({ 
     url: '/chat_ajax.php', 
     type: 'post', 
     data: { method: 'fetch'}, 
     success : function(data) { 
      $('#chat .messages').html(data); 
      $("#chat").scrollTop($("#chat")[0].scrollHeight); 
     } 
    }); 
} 
chat.interval = setInterval(chat.fetchMessages, 1000); 
chat.fetchMessages(); 

Kann jemand bitte Blick verpasst haben an meinem (Basic) Code, und sehen Sie, ob Sie erkennen können, wo das Speicherleck auftritt, und was ich falsch mache? Muss ich einige Variablen oder etwas aufheben?

Vielen Dank!

+2

Welche Version von jQuery? Wenn Sie jQuery 1.9.1 verwenden, tritt es immer noch auf? Ältere Versionen von jQuery verfügten über einen internen Cache, in dem einfache HTML-Strings gespeichert waren. Wenn Entwickler Code wie den oben genannten Code verwendeten, wurde ein Speicherleck erzeugt, weil der Cache nie gelöscht wurde. –

+0

was ich nicht verstanden habe ist $ ('# chat .messages') .html (data); bekommst du immer den ganzen Chat-Inhalt mit AJAX-Anfrage. Ich denke, Sie sollten nur den Teil anfordern, den der Benutzer noch nicht gelesen hat, und ihn an .messages anhängen. Andernfalls werden die Daten letztendlich ein riesiger Text sein. –

Antwort

5

Nie Verwenden Sie setInterval() mit AJAX, sonst bleiben Ihre Anfragen nie synchronisiert. Verwenden Sie stattdessen setTimeout() und dann ausstehende Ihre Logik, initiieren Sie die setTimeout() rekursiv im complete Callback.

Beispiel.

$(DoMyAjax); // start your ajax on DOM ready 
function DoMyAjax() { 
    $.ajax({ 
     complete: function() { 
      // your logic here 
      setTimeout(DoMyAjax, 1000); 
     } 
    }); 
} 
+0

Danke Brad! Ich denke, Sie haben den Nagel auf den Kopf getroffen ... –

+0

Dies tatsächlich multipliziert die Speicherlecks - jetzt ist es Megabyte pro Sekunde statt Kilobyte! –

+0

@NeilHillman ist das der Fall, wie Helga sagt? Es scheint so, als würde es auf einem der obigen Kommentare basieren, der besagt, dass jQuery einen Cache von HTML-Strings speichert, der sich niemals selbst löscht – ScottC