jQuery命令元素,删除,分离,克隆,追加内存泄漏

时间:2012-01-27 15:36:49

标签: javascript jquery memory-management memory-leaks

我有一个父div,里面有大约300个div,里面包含一个图像和一些文本。我有一个数组,其中包含我需要重新排序div的所有信息,使用引用..

如果然后在我订购之后循环通过数组然后按顺序移动元素我会得到高达100MB额外时间的严重内存泄漏我对它们进行排序!

我尝试过几种方法但仍然没有成功

$.each(gameArray , function($idx, $itm) { 
    $("#elementid"+ $itm.split('|#|')[0] ).appendTo($("#parent"));
}); 

另一次尝试

$.each(gameArray , function($idx, $itm) { 
    var element = $("#elementid"+ $itm.split('|#|')[0] ).detach();
    element.appendTo($("#parent"));
    element = null;
}); 

另一次尝试

$.each(gameArray , function($idx, $itm) { 
    var element = $("#elementid"+ $itm.split('|#|')[0] ).clone(true).remove();
    element.appendTo($("#parent"));
    element = null;
}); 

我读到了分离将元素保存在DOM中,所以当你把它放回到页面时它不会重新创建任何内容并且不会增加内存,但它似乎没有用?!

有什么东西我不见了?必须有一种方法来排序它们而不增加那么多的记忆?

我发现的所有示例都使用了大约10个列表元素的有序列表,因此您不会注意到内存增加!

2 个答案:

答案 0 :(得分:0)

尝试类似这样的例子:

<强> HTML:

<div id="parent">
    <div id="0">0</div>
    <div id="1">1</div>
    <div id="2">2</div>
    <div id="3">3</div>
    <div id="4">4</div>
    <div id="5">5</div>
    <div id="6">6</div>
    <div id="7">7</div>
    <div id="8">8</div>
    <div id="9">9</div>
</div>

<强>使用Javascript:

var games = [ 4, 3, 0, 2, 5, 1, 6, 9, 7, 8 ]; // desired sort order

var $parent = $('#parent');
var $children = $parent.children('div');

$children.detach().sort(function(a,b){
    var aId = parseInt( $(a).attr('id'), 10 );
    var bId = parseInt( $(b).attr('id'), 10 )
    return games.indexOf(aId) > games.indexOf(bId);
});

$parent.append($children);

这会将您的孩子分开,对它们进行排序,然后将它们追加到父级,避免在排序过程中修改DOM。

答案 1 :(得分:0)

在遇到性能问题的繁重(DOM)操作中,您应该完全删除jQuery,然后返回到vanilla JavaScript(特别是如果no-jQuery替代方案适用于所有现代浏览器)。

var fragment = document.createDocumentFragment(); // Temporary storage
for (var $idx=0, len = gameArray.length; $idx<len; $idx++) {
    var $itm = $gameArray[$idx];
    fragment.appendChild(
        document.getElementById("elementid" + $itm.split('|#|', 1)[0] )
    );
}
// Append all items to parent
document.getElementById('parent').appendChild(fragment);

使用的方法是: