3

iframe의 'src'속성을 으로 업데이트하는 jquery가있는 메뉴를 통해 iframe을 사용하여 콘텐츠를로드하고 있습니다. 그러면 원하는 페이지에서로드됩니다. 각각의 페이지에는 자체 자바 스크립트가 포함되어 있으며 많은 양의 콘텐츠가 있습니다. 다음과 같이iframe 기반 IE6 자바 스크립트 메모리 누수?

$(document).ready(function() { 
    loadPage('main.php'); 
}); 

function loadPage(url) { 
    $('#applicationFrame').attr('src', url); 
} 

그리고 인덱스 페이지에 iframe이 보이는 : - -은 다음과 같이

코드는

<iframe id="applicationFrame" application="yes" trusted="yes" frameborder="0" /> 

(사이드 노트 : 나는 실현 여기에 iframe을 복용된다 비표준 속성이지만 이것은 Microsoft HTA 중 하나에서 실행되는 내부 인트라넷 응용 프로그램입니다.

어쨌든 메뉴 항목은 의 javascript : loadPage ('whatever.php')를 호출하여 필요한 모든 내용을로드합니다.

내가 직면 한 문제는 메뉴의 각 후속 페이지를 클릭하면 프레임이 메모리가 누출되어 결국 전체 앱이 크롤링 속도가 느려질 때까지 발생한다는 것입니다. 체 보고서 다음 - 누수 열마다 클릭 여기 승순

leaks http://img37.imageshack.us/img37/3997/leaks.png

누수 관리자 검사 등 (- -> 44 21> 65)

것이 보여

inspector http://img527.imageshack.us/img527/4430/inspector.png

누출 된 전체 iframe 콘텐츠 인 것처럼 보입니다.

어쨌든 이것을 피할 수 있습니까? 내가 놓친 게 있니? 도이체 프레임 워크가 가지고있는 비슷한 문제를 발견했습니다.하지만 제안 된 해결책을 시도해 본 결과 이 작동하지 않는 것 같습니다. 나는 또한 다른 것들을 붙여 넣은 것처럼 시도했습니다 here하지만 해결되지 않습니다.

이것은 단지 (놀람) IE6에 영향을 미치는 것으로 보이는데 실제로 응용 프로그램의 유일한 대상이 입니다.

답변

2

잠시 시간을 들여서 jQuery를 덜 수정했습니다. SIEve에 따라 더 이상 유출되지 않는 것 같습니다.

function pos(obj) { 
    var curleft = 0; 
    var curtop = 0; 
    if (obj.offsetParent) { 
     do { 
      curleft += obj.offsetLeft; 
      curtop += obj.offsetTop; 
     } while (obj = obj.offsetParent); 
    } 
    obj = null; 
    return {left:curleft, top:curtop}; 
} 

function loadPage(url) { 
    var y = document.getElementById('container'); 
    var x = document.getElementById('applicationFrame'); 
    var p = pos(y); 
    if (x.src) { 
     var tmp = y.cloneNode(false); 
     var tmpIF = x.cloneNode(false); 
     tmpIF.src = url; 
     tmp.appendChild(tmpIF); 
     tmp.style.position = 'absolute'; 
     tmp.style.visibility = 'hidden'; 
     tmp.style["z-index"] = 20; 
     tmp.style.top = p.top; 
     tmp.style.left = p.left; 
     y.id = "delete"; 
     x.id = "deleteApplicationFrame"; 
     document.getElementsByTagName("body")[0].appendChild(tmp); 
     tmpIF = null; tmp = null; 
    } 
    setTimeout("document.getElementById('applicationFrame').style.visibility = 'visible'; var i = document.getElementById('deleteApplicationFrame'); i = i.contentDocument || i.contentWindow.document; i.documentElement.parentNode.removeChild(i.documentElement); i=null; i=document.getElementById('delete'); i.parentNode.removeChild(i); i=null;", 500); 
    y = null; x = null; p = null; 
} 

<div id="container"> 
    <iframe id="applicationFrame" application="yes" trusted="yes" frameborder="0" src="main.php"/> 
</div> 

가능 전체 응용 프로그램을 모른 채에 갈 수 있는지 말해 아주 열심히. 특히 IE6는 메모리 누수가있는 b..ch입니다.다른 값으로 src을 설정하는 것은 정말에 지정되지 않은 경우

몇 읽기 AFAIK, 동작을

Understanding and Solving Internet Explorer Leak Patterns

Fixing Leaks

Memory Leakage in Internet Explorer - revisited


그냥 생각 링크 W3C HTML DOM 사양 또는 링크 된 사람입니까?

loadPage('main.php');을 사용하는 대신 iframe에 초기 src="main.php" 값을 설정하고 iframe의 이름을 설정하는 것이 좋습니다.

이상적으로 메뉴 항목 <a> 태그는 다음 당신은 응답을 대신 자바 스크립트 기반 솔루션

+0

하이의 <a href="notmain.php" target="nameOfYourIFrame">FooBar</a>, 감사를 사용하여 테스트 할 수있다. 나는 시도하고 분류하는 것이 꽤 끔찍한 문제라는 것을 깨달았다. 오, 그리고 이전에 본 링크에 감사드립니다. 메뉴 항목에 대해서는 불행히도 같은 방식으로 누출되는 것으로 보이지만 (나쁘지는 않지만) 내 희망을 얻은 앵커 태그를 사용하라는 제안을 (전 단지 onclick 이벤트를 사용하고있었습니다) 시도했습니다. src = "main.php"를 기본값으로 설정하면 첫 번째 클릭에서 도움이 된 스크린 샷의 '21'대신 '1'로 변경된 누수가 줄어 들었습니다. 문제는 아직도 당신이 클릭하는 더 많은 섹션으로 남아 있습니다. 다시 쓸 준비가되었습니다 (!) –

+0

안녕하세요 확인 확장 답변 – jitter

+0

와우,이 완벽하게 작동합니다. 이 점에 대해 많은 점이 인정되어 IE6에서 제 머리카락을 찢어 버릴 수있었습니다. –