2012-01-27 29 views
2

我有一個父div與大約300 div的所有其中包含一個圖像和一些文本。我有一個數組,其中包含我需要重新排列div的所有信息,使用參考..jQuery順序元素,刪除,分離,克隆,追加內存泄漏

如果如果然後循環通過數組後,我已經命令它,然後移動元素accordinly我得到嚴重的內存泄漏高達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如此當你把它放回頁面時,它不會重新創建任何內容,也不會增加內存,但它確實如此nt似乎工作?!

有什麼我不知道?必須有一種方法來排序它們而不增加記憶力呢?

我發現的所有例子都使用了有序列表和大約10個列表元素,所以你不會注意到內存的增加!

+1

你嘗試過移動而不的jQuery的DOM元素?也許不斷創建的jquery對象是一個問題?! – Yoshi 2012-01-27 15:42:22

+0

還沒有!生病了,現在看看併發布我的發現! – rorypicko 2012-01-27 15:55:42

+0

var parent =文件。的getElementById( 'game_panel'); \t \t \t \t。每$(koko.data( 'newGameArray'),函數($ IDX,$ ITM){ \t \t \t \t \t變種元素=的document.getElementById( 'gameidis' + $ itm.split(」 |#|')[0]); \t \t \t \t \t parent.appendChild(element.parentNode.removeChild(元件)); \t \t \t \t}); 使用標準的javascript導致相同的泄漏! – rorypicko 2012-01-27 16:23:56

回答

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

所用的方法是:

+0

感謝您的回覆,但即時通訊仍然有內存泄漏與此示例...如果我刪除實際存儲在fragmenet中的元素的代碼並追加它,它不會泄漏內存,所以它不是任何其他碼!奇怪的! – rorypicko 2012-01-31 12:32:00

+0

你必須展示完整的演示,纔可以進一步幫助.. – 2012-01-31 14:41:35

+0

是的,我明白了,只是做了一個快速測試,它似乎是圖像,如果我從每個div去掉img標籤,不要走!每個圖像只有100×75,但沒有它們在內存中保持不變!也許你不能在分散的內存中存儲img?! – rorypicko 2012-01-31 15:35:03

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。

+0

我似乎仍然得到這種方法相同的內存泄漏!? – rorypicko 2012-01-27 17:12:22