2013-03-14 32 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字符串,然后当开发人员使用上述代码时,它会生成看起来像是内存泄漏的内容,因为缓存永远不会被清除。 – 2013-03-14 15:57:04

+0

我不明白的是$('#chat .messages')。html(data);你是否总是通过AJAX请求获取整个聊天内容?我认为你应该只请求没有阅读的部分用户将它附加到.messages。否则数据将最终成为一个巨大的文本。 – 2013-03-14 17:26:59

回答

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

谢谢布拉德!我认为你已经击中了头部... – 2014-01-20 09:20:21

+0

这实际上会增加内存泄漏 - 现在是每秒兆字节而不是千字节! – 2016-08-31 10:33:01

+0

Helga说,@NeilHillman就是这样吗?它似乎基于上述评论之一,说jQuery保留一个永远不会自行清除的html字符串缓存 – ScottC 2017-03-29 17:32:01