2012-01-27 6 views
2

나는 이미지와 일부 텍스트를 모두 포함하는 약 300 div의 부모 div가 있습니다. 내가 참조를 사용하여 divs를 재정렬 할 필요가있는 모든 정보를 포함하는 배열을 가지고 ..jQuery order elements, remove, detach, clone, memory leaks 추가

만약 내가 그것을 주문한 후 배열 요소를 옮긴 다음 루프를 통해 요소를 이동 시키면 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; 
}); 

내가 분리가 DOM에서 요소를 이렇게 계속 읽었

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

또 다른 시도 다시 페이지에 넣을 때 아무것도 재현하지 못하고 메모리를 늘리지는 않지만 그렇게합니다. NT는 작동하는 것 같다!

뭔가 빠졌습니까? 그만큼 메모리를 늘리지 않고 정렬 할 수있는 방법이 있어야합니까?

모든 예제에서는 약 10 개의 목록 요소가있는 정렬 된 목록을 사용하고 있기 때문에 메모리 증가를 알 수 없습니다! 이 예와 같이

+1

는 jQuery를없이 DOM 요소를 이동 시도? 어쩌면 jquery 객체의 끊임없는 생성이 문제일까요? – Yoshi

+0

아직! 아프고 지금 내 표정을 게시! – rorypicko

+0

var parent = document.getElementById ('game_panel'); \t \t \t \t $ .each (koko.data ('newGameArray'), 함수 ($ IDX, $ ITM) { \t \t \t \t \t VAR 소자 = document.getElementById를 ('gameidis'+ $ itm.split (' | # | ') [0]); \t \t \t \t \t parent.appendChild (element.parentNode.removeChild (요소)) \t \t \t \t}); 표준 자바 스크립트를 사용하면 같은 누출이 발생합니다! – rorypicko

답변

0

성능 문제가있는 무거운 (DOM) 작업에서는 jQuery를 완전히 삭제하고 바닐라 자바 ​​스크립트로 되돌려 야합니다 (특히 최신 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에 요소를 저장하고 그것을 추가하는 코드를 제거하고 메모리 누수가 없으므로 다른 것 중 어느 것도 deifnalty가 아닙니다. 암호! 기묘한! – rorypicko

+0

내가 더 이상 도울 수 있기 전에 당신은 전체 데모를 보여줘야한다. –

+0

예, 나는 단지 빠른 테스트를했다. 그리고 그것은 이미지 일 것이다. 만약 각 div의 img 태그를 제거한다면, 올라가지 마! 각 이미지는 100 x 75의 aroun이지만 메모리에 저장하지 않으면 동일하게 유지됩니다! 어쩌면 당신은 조각난 메모리에 img를 저장할 수 있습니까?! – rorypicko

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> 

자바 스크립트 : 이것은 당신의 아이를 분리

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