När navigering görs i HTML-innehåll, eller när HTML-innehåll ignoreras på grund av att fönstret som innehållet finns i stängs, tas inte de händelseavlyssnare som refererar till objekten på den ej inlästa sidan bort automatiskt. Om ett objekt skickar en händelse till en hanterare som redan har tagits bort visas ett felmeddelande av följande typ: "Programmet försökte referera till ett JavaScript-objekt på en HTML-sida som inte finns inläst."
För att undvika det här felet tar du bort JavaScript-händelseavlyssnare på en HTML-sida innan sidan tas bort. Vid sidnavigering (i ett HTMLLoader-objekt) tar du bort händelseavlyssnaren under
unload
-händelsen för
window
-objektet.
Följande JavaScript-kod tar till exempel bort en händelseavlyssnare för en
uncaughtScriptException
-händelse:
window.onunload = cleanup;
window.htmlLoader.addEventListener('uncaughtScriptException', uncaughtScriptException);
function cleanup()
{
window.htmlLoader.removeEventListener('uncaughtScriptException',
uncaughtScriptExceptionHandler);
}
Om du vill förhindra att det här felet uppstår när fönster som innehåller HTML-innehåll stängs, så anropar du en cleanup-funktion som svar på
closing
-händelsen för NativeWindow-objektet (
window.nativeWindow
). Följande JavaScript-kod tar till exempel bort en händelseavlyssnare för en
uncaughtScriptException
-händelse:
window.nativeWindow.addEventListener(air.Event.CLOSING, cleanup);
function cleanup()
{
window.htmlLoader.removeEventListener('uncaughtScriptException',
uncaughtScriptExceptionHandler);
}
Du kan också förhindra att det här felet inträffar genom att ta bort en händelseavlyssnare så snart den körs (om händelsen bara behöver hanteras en gång). Följande JavaScript-kod skapar till exempel ett html-fönster genom att anropa metoden
createRootWindow()
för klassen HTMLLoader och lägger till en händelseavlyssnare för
complete
-händelsen. När
complete
-händelsehanteraren anropas tar den bort sin egen händelseavlyssnare med hjälp av
removeEventListener()
-funktionen:
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"));
Om du tar bort onödiga händelseavlyssnare kan systemets skräpinsamlare frigöra det minne som var kopplat till dessa avlyssnare.