jQuery,.empty()和内存

时间:2010-05-27 12:19:36

标签: jquery

我的应用程序(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的内存。 我做错了什么?

4 个答案:

答案 0 :(得分:2)

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

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

此错误描述了问题以及应该修复它的jQuery的简单补丁:

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

答案 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';

?>