HTML 내용이 이동하거나 HTML 내용이 포함하는 윈도우가 닫히기 때문에 해당 내용이 버려지는 경우 언로드된 페이지의 객체를 참조하는 이벤트 리스너는 자동으로 제거되지 않습니다. 한 객체가 이미 언로드된 핸들러에 이벤트를 전달하는 경우 "응용 프로그램에서 더 이상 로드되지 않는 HTML 페이지의 JavaScript 객체를 참조하려고 시도했습니다."라는 오류 메시지가 표시됩니다.
이 오류를 피하려면 HTML 페이지가 없어지기 전에 해당 페이지에서 JavaScript 이벤트 리스너를 제거합니다. HTMLLoader 객체 내에서 페이지를 이동하는 경우
window
객체의
unload
이벤트 중에 이벤트 리스너를 제거합니다.
예를 들어, 다음 JavaScript 코드는
uncaughtScriptException
이벤트에 대한 이벤트 리스너를 제거합니다.
window.onunload = cleanup;
window.htmlLoader.addEventListener('uncaughtScriptException', uncaughtScriptException);
function cleanup()
{
window.htmlLoader.removeEventListener('uncaughtScriptException',
uncaughtScriptExceptionHandler);
}
HTML 내용이 포함된 윈도우를 닫을 때 오류가 발생하지 않게 하려면 NativeWindow 객체(
window.nativeWindow
)의
closing
이벤트에 대한 응답으로 cleanup 함수를 호출합니다. 예를 들어 다음 JavaScript 코드는
uncaughtScriptException
이벤트에 대한 이벤트 리스너를 제거합니다.
window.nativeWindow.addEventListener(air.Event.CLOSING, cleanup);
function cleanup()
{
window.htmlLoader.removeEventListener('uncaughtScriptException',
uncaughtScriptExceptionHandler);
}
이벤트 리스너가 실행되는 즉시 제거함으로써 이 오류가 발생하는 것을 막을 수도 있습니다(이벤트를 한 번만 처리하면 되는 경우). 예를 들어, 다음 JavaScript 코드는 HTMLLoader 클래스의
createRootWindow()
메서드를 호출하여 html 윈도우를 만들고
complete
이벤트에 대한 이벤트 리스너를 추가합니다.
complete
이벤트 리스너를 호출하면
removeEventListener()
함수를 사용하여 고유 이벤트 리스너를 제거합니다.
var html = runtime.flash.html.HTMLLoader.createRootWindow(true);
html.addEventListener('complete', htmlCompleteListener);
function htmlCompleteListener()
{
html.removeEventListener(complete, arguments.callee)
// handler code..
}
html.load(new runtime.flash.net.URLRequest("second.html"));
사용되지 않는 이벤트 리스너를 제거하면 시스템 가비지 수집기에서 해당 리스너와 연결된 메모리를 모두 회수할 수 있습니다.