jQuery,.empty()和内存

我的应用程序(ASP.NET MVC)显示了一个页面,它以一定的间隔不断加载数据。

jQuery脚本调用一个控制器,然后根据某些条件呈现不同的局部视图。

这个局部视图是用jQuery附加到DOM的; 使用empty()方法删除以前的元素。

$(document).ready(function() { var ScheduledAction = function(func, times, interval) { var ID = window.setInterval(function(times) { return function() { if (times > -1) { if (--times <= 0) window.clearInterval(ID); } func(); } } (times), interval); }; ScheduledAction(function() { LoadAppointments(); }, -1, ); }); function LoadAppointments() { $("#AppointmentsList").empty(); $('#loading').html(""); $.get(UrlAction, function(data) { if (data != '') { $('#AppointmentsList').append(data); $('#loading').empty(); } else { $('#loading').fadeOut(3000, function() { $('#loading').empty(); }); } }); } 

控制器(UrlAction)返回局部视图。 对于每次往返,部分视图是不同的。 部分视图只包含一个图像。 在另一种情况下是一个带有一些信息的div。

我意识到有一天浏览器会加载600Mb的内存。 我究竟做错了什么?

它可能只是jQuery中的一个错误?

我遇到过类似的问题,主要是在IE的所有版本中随着时间的推移做大量的AJAX请求。

这个bug描述了这个问题,还有一个简单的jQuery补丁应该修复它:

http://dev.jquery.com/ticket/6242

我相信这不是你错了,而是它是在浏览器中实现JavaScript。 您是否在不同的浏览器(Firefox,Opera,Internet Explorer)中或仅在某些特定浏览器中遇到此问题?

要获得更好的答案,您应该发布一些呈现页面的JavaScript代码 – 也许可以进行一些优化。

您可以使用Drip工具检查DOM是否泄漏( 文章 )作为临时解决方法,您应该定期完全重新加载整个页面。

你可能想尝试这样做:

[EDIT]删除了返回setInterval的函数

 $(document).ready(function() { $('#loading').html("").hide(); ScheduledAction(LoadAppointments, -1, <%=Model.RefreshTimeout %>); }); function ScheduledAction(func, times, interval) { var ID = window.setInterval(function() { if (times > -1) { if (--times <= 0) window.clearInterval(ID); } func(); }, interval); } function LoadAppointments() { $("#AppointmentsList").empty(); $('#loading').show(); $.get(UrlAction, function(data) { if (data != '') { $('#AppointmentsList').append(data); $('#loading').hide(); } else { $('#loading').fadeOut(3000); } }); } 

我注意到每次装载约会时你都在加载你的微调器。 你也是times进入window.setInterval

我测试此函数的代码是:

 $(document).ready(function() { $('#loading').html("").hide(); ScheduledAction(LoadAppointments, 1, 100); }); function ScheduledAction(func, times, interval) { var ID = setInterval(function() { if (times > -1) { if (--times <= 0) clearInterval(ID); } func(); }, interval); } function LoadAppointments() { $("#content").empty(); $('#loading').show(); $.get('contentServer.php', function(data) { if (data != '') { $('#content').append(data); $('#loading').hide(); } else { $('#loading').fadeOut(3000); } }); } 

php文件:

 //contentServer.php