Cuando el contenido HTML se desplaza, o se desecha porque se cierra la ventana que lo contiene, los detectores de eventos que hacen referencia a objetos en la página descargada no se eliminan automáticamente. Cuando un objeto distribuye un evento a un controlador que ya se ha descargado, aparece el siguiente mensaje de error: "The application attempted to reference a JavaScript object in an HTML page that is no longer loaded." (La aplicación intentó hacer referencia a un objeto JavaScript en una página HTML que ya no está cargada).
Para evitar este error, elimine los detectores de eventos de JavaScript que haya en una página HTML antes de que esta desaparezca. En el caso del desplazamiento por páginas (en un objeto HTMLLoader), elimine detector de eventos durante el evento
unload
del objeto
window
.
En el siguiente ejemplo, el código JavaScript elimina un detector de eventos para un evento
uncaughtScriptException
:
window.onunload = cleanup;
window.htmlLoader.addEventListener('uncaughtScriptException', uncaughtScriptException);
function cleanup()
{
window.htmlLoader.removeEventListener('uncaughtScriptException',
uncaughtScriptExceptionHandler);
}
Para evitar que se produzca el error al cerrar ventanas con contenido HTML, llame a una función "cleanup" (limpieza) como respuesta al evento
closing
del objeto NativeWindow (
window.nativeWindow
). En el siguiente ejemplo, el código JavaScript elimina un detector de eventos para un evento
uncaughtScriptException
:
window.nativeWindow.addEventListener(air.Event.CLOSING, cleanup);
function cleanup()
{
window.htmlLoader.removeEventListener('uncaughtScriptException',
uncaughtScriptExceptionHandler);
}
Este error se puede evitar eliminando un detector de eventos cuando se ejecute (si el evento solo se debe gestionar una vez). En el siguiente ejemplo, el código JavaScript crea una ventana html llamando al método
createRootWindow()
de la clase HTMLLoader y añade un detector de eventos para el evento
complete
. Cuando se llama al controlador de eventos
complete
, elimina su propio detector de eventos con la función
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"));
La eliminación de detectores de eventos que ya no se necesitan permite al recolector de datos innecesarios del sistema recuperar la memoria asociada con esos detectores.