>웹 프론트엔드 >JS 튜토리얼 >IE browser_javascript 기술에서 IFrame 개체 메모리가 해제되지 않는 문제에 대한 해결 방법

IE browser_javascript 기술에서 IFrame 개체 메모리가 해제되지 않는 문제에 대한 해결 방법

WBOY
WBOY원래의
2016-05-16 16:39:071755검색

최근 프로젝트 팀은 showModalDialog를 사용하는 팝업 양식에 IFrame 개체가 포함된 경우 양식이 닫힌 후에도 IFrame 개체가 차지하는 메모리 리소스가 해제되지 않는다는 사실을 발견했습니다. 팝업과 닫기가 여러 번 반복되면 IE 브라우저가 차지하는 메모리가 수백 MB를 초과할 수 있습니다. 심각한 경우 IE 브라우저에서 오류가 보고되고 브라우저를 다시 시작할 수 없는 유일한 방법은 브라우저를 종료하는 것입니다. 과정. 테스트 후 open 메소드를 사용하여 팝업할 때도 이 문제가 발생합니다.

IE8 브라우저에서는 open과 showModalDialog 팝업 사이에 메모리 사용량에 차이가 있습니다.

열기 모드에서 나타나는 양식은 독립적인 iexplorer.exe 프로세스를 차지합니다.

showModalDialog에 의해 팝업된 양식은 상위 양식과 동일한 iexplorer.exe 프로세스를 사용합니다.

검색 결과 양식을 닫기 전에 양식에서 IFrame 개체를 삭제하는 것이 해결책이라는 것을 알았습니다.

<span style="font-size:18px">
var el = document.getElementById("scanIf");
el.src="";
el.contentWindow.document.write('');
el.contentWindow.document.clear();
var p = el.parentNode;
p.removeChild(el);
</span>

하지만 테스트 중에 두 가지 제한 사항을 발견했습니다.

1. el.src가 아직 실행되지 않았을 수 있으며, IFrame에 크로스 도메인 콘텐츠가 포함되어 있으면 권한이 없다는 메시지가 표시됩니다.

2. 스크립트가 실행되는 것보다 빠르게 양식이 닫히고 메모리가 아직 해제되지 않습니다.

수정 후 최종 스크립트는 다음과 같습니다.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD><TITLE></TITLE>
<BODY onbeforeunload="return unloadHandler();">
<IFRAME id="scanIf" width="800px" height="600px" src = "http://www.baidu.com"></IFRAME>
<SCRIPT type="text/javascript">
function unloadHandler(notip) {
// 取消窗口关闭时的监听事件
document.getElementsByTagName("BODY")[0].onbeforeunload = null;
var el = document.getElementById("scanIf");
if (el) {
el.src = "";
setTimeout(cycleClear, 100);
return "提示:请点击取消按钮,当前窗口会自动关闭。";
}
return true;
}

function cycleClear() {
try {
var el = document.getElementById("scanIf");
if (el) {
el.contentWindow.document.write('');
el.contentWindow.document.clear();
var p = el.parentNode;
p.removeChild(el);
}
window.close();
} catch (e) {
setTimeout(cycleClear, 100);
}
}
//window.onunload = unloadHandler;
</SCRIPT>
<input type="button" value="remove" onclick="unloadHandler();">
</BODY></HTML>
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.