代码之家  ›  专栏  ›  技术社区  ›  LeftyX

jquery、.empty()和内存

  •  4
  • LeftyX  · 技术社区  · 14 年前

    我的应用程序(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 回复  |  直到 13 年前
        1
  •  2
  •   Ryley    14 年前

    它可能只是jquery中的一个bug?

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

    这个bug描述了这个问题,并对jquery进行了一个简单的补丁,可以修复这个问题:

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

        2
  •  1
  •   naivists    14 年前

    我相信这不是你错了,而是浏览器中的javascript实现。您是在不同的浏览器(火狐、Opera、Internet Explorer)中遇到这个问题,还是只在某些特定的浏览器中遇到这个问题?

    为了得到更好的答案,您应该发布一些呈现页面的javascript代码——可能有一些优化。

        3
  •  0
  •   Andrew Florko    14 年前

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

        4
  •  0
  •   Gutzofter    14 年前

    您可能需要尝试以下方法:

    [编辑]删除了返回到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';
    
    ?>