代码之家  ›  专栏  ›  技术社区  ›  TM. Randy Simon

防止AJAX内存泄漏

  •  7
  • TM. Randy Simon  · 技术社区  · 16 年前

    我正在开发一个web应用程序,该应用程序旨在显示一组使用AJAX定期更新的数据。一般的使用场景是,用户会让它整天打开,然后不时地看一眼。

    我遇到了一个问题,浏览器的内存占用随着时间的推移增长缓慢。这在Firefox和IE7中都有发生(虽然不是在Chrome中)。几个小时后,它可能会导致IE7的内存占用约为200MB,而FF3的内存占用约为400MB。

    经过大量测试,我发现只有在AJAX调用得到响应时才会发生内存泄漏。如果服务器没有响应任何内容,我可以让页面打开几个小时,这样占用的空间就不会增加。

    有没有人对使用prototype/AJAX防止内存泄漏有什么建议?或者关于如何解决此问题的任何方法?

    here .

    2 回复  |  直到 16 年前
        1
  •  11
  •   eyelidlessness    16 年前

    你能注意的最大的事情是事件,以及你如何分配它们。

    例如,以这个场景为例(因为您没有提供):

    <div id="ajaxResponseTarget">
        ...
    </div>
    <script type="text/javascript">
        $(someButton).observe('click', function() {
            new Ajax.Updater($('ajaxResponseTarget'), someUrl, {
                onSuccess: function() {
                    $$('#ajaxResponseTarget .someButtonClass').invoke('observe', 'click', function() {
                        ...
                    });
                }
            });
        });
    </script>
    

    这将导致内存泄漏,因为 #ajaxResponseTarget 已更新(内部,原型将使用 innerHTML )元素与 click 事件将从文档中删除,而不会删除其事件。第二次单击时 someButton

    避免这种情况的一种方法是使用事件委派:

    <div id="ajaxResponseTarget">
        ...
    </div>
    <script type="text/javascript">
        $('ajaxResponseTarget').observe('click', function(e) {
            if(e.element().match('.someButtonClass')) {
                ...
            }
        });
        $(someButton).observe('click', function() {
            new Ajax.Updater($('ajaxResponseTarget'), someUrl);
        });
    </script>
    

    由于DOM事件的工作方式,单击 .someButtonClass 也会开火 ,原型使确定事件的目标元素变得非常简单。没有为元素指定任何事件 在内部 #ajaxResponseTarget ,因此无法将其内容替换为中目标的孤立事件。

        2
  •  -2
  •   Mr. Muskrat    16 年前

    我可能错了,但听起来好像是在响应对象周围创建闭包。每个响应对象都会不同,这会导致内存占用增加。