2013-03-14 66 views
5

投稿された新しいメッセージをフェッチするために、毎秒ajaxコールを実行する小さなチャットボックスウィジェットを作成しました。問題はそれがメモリを漏らしていることであり、開かれている約15分後に私のブラウザ(Firefox)がクラッシュする。jQuery AJAXでメモリリークが発生しました

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(); 

ことができる人下さい一目で私の(..私は相対的な初心者ですように、それは、おそらく私です、と私は私が何かを見逃しているかなど、私の変数は、設定解除わけではないと確信しています基本的な)コードを使用して、メモリリークが発生している箇所や、間違っている箇所を特定できるかどうかを確認します。いくつかの変数や何かを解除する必要がありますか?

多くの感謝!

+2

jQueryのどのバージョンですか? jQuery 1.9.1をインクルードしても、まだ発生しますか?以前のバージョンのjQueryには単純なhtml文字列が格納された内部キャッシュがあり、開発者が上記のようなコードを使用すると、キャッシュが決してクリアされないためメモリリークのように見えました。 –

+0

私が理解できなかったことは$( '#chat .messages')です.html(data);あなたはいつもAJAXリクエストでチャットの内容全体を取得しますか?私はあなたがまだ読まなかった部分だけをリクエストして、これを.messagesに追加するべきだと思います。さもなければ、データは最終的に巨大なテキストになります。 –

答えて

5

setInterval()とajaxを使用してください。そうしないと、リクエストは決して同期されません。代わりにsetTimeout()を使用してロジックを保留にしてからcompleteコールバックでsetTimeout()を再帰的に開始してください。

例。

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

Bradに感謝します!私はあなたが頭の爪に当たったと思っています... –

+0

これは実際にメモリリークを増やします - 今はキロバイトではなく、毎秒メガバイトです! –

+0

@NeilHillmanはHelgaが主張しているように、このケースですか?上記のコメントの1つに基づいて、jQueryは決して自分自身を決して消去しないhtml文字列のキャッシュを保持しているようです – ScottC

関連する問題