Disponibilidad de objetos ActionScript en JavaScript

Adobe AIR 1.0 y posterior

JavaScript en la página HTML cargada por un objeto HTMLLoader puede llamar a las clases, objetos y funciones definidas en el contexto de ejecución de ActionScript utilizando las propiedades window.runtime , window.htmlLoader y window.nativeWindow de la página HTML. También se pueden hacer disponibles los objetos ActionScript y las funciones para el código JavaScript creando referencias a los mismos dentro del contexto de ejecución de JavaScript.

Ejemplo básico de acceso a los objetos JavaScript desde ActionScript

En el siguiente ejemplo se muestra la manera de añadir propiedades haciendo referencia a objetos ActionScript al objeto global window de una página HTML:

var html:HTMLLoader = new HTMLLoader(); 
var foo:String = "Hello from container SWF."  
function helloFromJS(message:String):void { 
    trace("JavaScript says:", message); 
} 
var urlReq:URLRequest = new URLRequest("test.html"); 
html.addEventListener(Event.COMPLETE, loaded); 
html.load(urlReq); 
 
function loaded(e:Event):void{ 
    html.window.foo = foo; 
    html.window.helloFromJS = helloFromJS; 
}

El contenido HTML (en un archivo denominado test.html) cargado en el objeto HTMLLoader en el ejemplo anterior puede acceder a la propiedad foo y al método helloFromJS() definido en el archivo principal SWF:

<html> 
    <script> 
        function alertFoo() { 
            alert(foo);  
        } 
    </script> 
    <body> 
        <button onClick="alertFoo()"> 
            What is foo? 
        </button> 
        <p><button onClick="helloFromJS('Hi.')"> 
            Call helloFromJS() function. 
        </button></p> 
    </body> 
</html>

Cuando se accede al contexto JavaScript de un documento cargado, se puede utilizar el evento htmlDOMInitialize para crear objetos con suficiente anticipación en la secuencia de construcción de la página que cualquier script definido en la página puede acceder a los mismos. Si se espera para el evento complete , solo los scripts en la página que se ejecutan después del evento de página load pueden acceder a los objetos añadidos.

Disponibilidad de definiciones de clase en JavaScript

Para hacer disponibles las clases ActionScript de la aplicación en JavaScript, se puede asignar el contenido HTML cargado al dominio de aplicación que contiene las definiciones de clase. El dominio de aplicación del contexto de ejecución de JavaScript se puede definir con la propiedad runtimeApplicationDomain del objeto HTMLLoader. Para establecer, por ejemplo, el dominio de aplicación al dominio de aplicación principal se debe definir runtimeApplicationDomain en ApplicationDomain.currentDomain , como se muestra en el siguiente código:

html.runtimeApplicationDomain = ApplicationDomain.currentDomain;

Una vez que la propiedad runtimeApplicationDomain se define, el contexto de JavaScript comparte las definiciones de clase con el dominio asignado. Para crear una instancia de una clase personalizada en JavaScript, se debe hacer referencia a la definición de clase a través de la propiedad window.runtime y utilizar el operador new :

var customClassObject = new window.runtime.CustomClass();

El contenido HTML debe ser de un dominio de seguridad compatible. Si el contenido HTML es de un dominio de seguridad diferente al del dominio de aplicación que asigna, la página utiliza un dominio de aplicación predeterminado. Por ejemplo, si carga una página remota de Internet, no podrá asignar ApplicationDomain.currentDomain como el dominio de aplicación de la página.

Eliminación de detectores de eventos

Cuando se añaden detectores de eventos JavaScript a los objetos fuera de la página actual, incluyendo objetos runtime, objetos en contenido SWF cargado e inclusive objetos JavaScript ejecutándose en otras páginas, siempre se deben quitar esos detectores de eventos cuando se descarga la página. De lo contrario, el detector de evento distribuye el evento a una función de controlador que ya no existe. Si esto sucede, aparecerá 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ó realizar una referencia a un objeto JavaScript en una página HTML que ya no está cargada). Al quitar los detectores de eventos innecesarios también permite que AIR reclame la memoria asociada. Para más información, consulte Eliminación de detectores de eventos de páginas HTML que permiten la navegación .