相关疑难解决方法(0)

删除DOM时jQuery内存泄漏

这是一个死简单的网页,它使用jQuery泄漏IE8中的内存(我通过观察我的iexplore.exe进程的内存使用量在Windows任务管理器中随着时间的推移而检测到内存泄漏):

<html>
<head>
    <title>Test Page</title>
    <script type="text/javascript" src="jquery.js"></script>
</head>
<body>
<script type="text/javascript">
    function resetContent() {
        $("#content div").remove();
        for(var i=0; i<10000; i++) {
            $("#content").append("<div>Hello World!</div>");
        }
        setTimeout(resetTable, 2000);
    }
    $(resetContent);
</script>
<div id="content"></div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

显然即使在调用jQuery.remove()函数时我仍然会遇到一些内存泄漏.我可以编写自己的删除函数,不会发生内存泄漏,如下所示:

$.fn.removeWithoutLeaking = function() {
    this.each(function(i,e){
        if( e.parentNode )
            e.parentNode.removeChild(e);
    });
};
Run Code Online (Sandbox Code Playgroud)

这很好用,不泄漏任何内存.那为什么jQuery会泄漏内存呢?我创建了另一个基于的删除函数jQuery.remove(),这确实会导致泄漏:

$.fn.removeWithLeakage = function() {
    this.each(function(i,e) {
        $("*", e).add([e]).each(function(){
            $.event.remove(this);
            $.removeData(this);
        });
        if (e.parentNode)
            e.parentNode.removeChild(e);
    });
};
Run Code Online (Sandbox Code Playgroud)

有趣的是,内存泄漏似乎是由jQuery包含的每个调用引起的,以防止事件和与删除的DOM元素相关的数据的内存泄漏.当我调用该removeWithoutLeaking函数时,我的记忆会随着时间的推移而保持不变,但是当我打电话时removeWithLeakage它会继续增长.

我的问题是,每个电话怎么样

$("*", e).add([e]).each(function(){
    $.event.remove(this);
    $.removeData(this);
});
Run Code Online (Sandbox Code Playgroud)

可能是导致内存泄漏?

编辑:修复了代码中的拼写错误,经过重新测试,证明对结果没有影响. …

jquery memory-leaks

46
推荐指数
2
解决办法
4万
查看次数

标签 统计

jquery ×1

memory-leaks ×1