jQuery 排序元素、删除、分离、克隆、追加内存泄漏

发布于 2024-12-29 21:58:37 字数 925 浏览 0 评论 0原文

我有一个父 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 个列表元素的有序列表,因此您不会注意到内存增加!

I have a parent div with around 300 div's inside its all containing an image and some text. i have an array which contains all the information i need to reorder the divs, using references..

if if then loop through the array after i had ordered it and then move the elements accordinly i get severe memory leaks of up to 100MB extra time i sort them!

i have tried a few ways and still no success

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

another attempt

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

another attempt

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

i read that the detach keeps the element in DOM so when you put it back into the page it doesnt recreate anything and doesn't increase the memory, but it doesnt seem to work?!

is there something im missing? there must be a way of sorting them without increasing memory by that much?

All of the example i have found have been using ordered list's with around 10 list elements in so you dont notice the memory increase!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

滿滿的愛 2025-01-05 21:58:37

在遇到性能问题的繁重 (DOM) 操作中,您应该完全放弃 jQuery,并返回到普通 JavaScript(特别是如果非 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);

使用的方法有:

At heavy (DOM) operations where performance issues are encountered, you should completely drop jQuery, and go back to vanilla JavaScript (especially if the no-jQuery alternative works across all modern browsers).

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);

The used methods are:

策马西风 2025-01-05 21:58:37

尝试如下示例:

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。

Try something like this example:

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);

This detaches your children, sorts them, and then appends them back to the parent which avoids modifying the DOM during the sort process.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文