我的应用程序(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, <%=Model.RefreshTimeout %>);
});
function LoadAppointments() {
$("#AppointmentsList").empty();
$('#loading').html("<img src='Images/bigloader.gif' />");
$.get(UrlAction,
function(data) {
if (data != '') {
$('#AppointmentsList').append(data);
$('#loading').empty();
}
else {
$('#loading').fadeOut(3000, function() { $('#loading').empty(); });
}
});
}
控制器(UrlAction)返回局部视图。对于每次往返,部分视图是不同的。部分视图只包含一个图像。在另一种情况下是一个带有一些信息的div。
我意识到有一天浏览器加载了600Mb的内存。 我做错了什么?
答案 0 :(得分:2)
它可能只是jQuery中的一个错误?
我遇到过类似的问题,主要是在IE的所有版本中随着时间的推移做大量的AJAX请求。
此错误描述了问题以及应该修复它的jQuery的简单补丁:
答案 1 :(得分:1)
我相信这不是你错了,而是它是在浏览器中实现JavaScript。您是否在不同的浏览器(Firefox,Opera,Internet Explorer)中或仅在某些特定浏览器中遇到此问题?
要获得更好的答案,您应该发布一些呈现页面的JavaScript代码 - 也许可以进行一些优化。
答案 2 :(得分:0)
您可以使用滴灌工具(article)检查DOM是否泄漏 作为临时解决方法,您应该定期完全重新加载整个页面。
答案 3 :(得分:0)
你可能想尝试这样做:
[EDIT]删除了返回setInterval的函数
$(document).ready(function() {
$('#loading').html("<img src='Images/bigloader.gif' />").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("<img src='loader64.gif' />").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
<?php
echo 'The quick brown fox jumped over the lazy dogs back';
?>