Bereitstellen von ActionScript-Objekten für JavaScript

Adobe AIR 1.0 und höher

JavaScript in der von einem HTMLLoader-Objekt geladenen HTML-Seite kann die im ActionScript-Ausführungskontext definierten Klassen, Objekte und Funktionen mit der window.runtime -, window.htmlLoader - und window.nativeWindow -Eigenschaft der HTML-Seite aufrufen. Sie können ActionScript-Objekte und -Funktionen außerdem durch Erstellen von Verweisen auf diese im JavaScript-Ausführungskontext für JavaScript-Code bereitstellen.

Ein einfaches Beispiel zum Zugreifen auf JavaScript-Objekte mit ActionScript

Das folgende Beispiel veranschaulicht, wie Eigenschaften, die auf ActionScript-Objekte verweisen, dem globalen Fensterobjekt einer HTML-Seite hinzugefügt werden:

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; 
}

Der im vorhergehenden Beispiel in das HTMLLoader-Objekt geladene HTML-Inhalt (in der Datei „test.html“) kann auf die in der übergeordneten SWF-Datei definierte foo -Eigenschaft und helloFromJS() -Methode zugreifen:

<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>

Beim Zugreifen auf den JavaScript-Kontext eines ladenden Dokuments können Sie mithilfe des htmlDOMInitialize -Ereignisses Objekte so früh in der Seitenerstellungsfolge erstellen, dass in der Seite definierte Skripts auf sie zugreifen können. Wenn Sie das complete -Ereignis abwarten, können nur Skripts in der Seite, die nach dem load -Ereignis der Seite ausgeführt werden, auf die hinzugefügten Objekte zugreifen.

Bereitstellen von Klassendefinitionen für JavaScript

Um die ActionScript-Klassen der Anwendung in JavaScript bereitzustellen, können Sie den geladenen HTML-Inhalt der Anwendungsdomäne zuweisen, die die Klassendefinitionen enthält. Die Anwendungsdomäne des JavaScript-Ausführungskontexts kann mit der runtimeApplicationDomain -Eigenschaft des HTMLLoader-Objekts festgelegt werden. Um die primäre Anwendungsdomäne als Anwendungsdomäne festzulegen, legen Sie für runtimeApplicationDomain ApplicationDomain.currentDomain fest, wie im folgenden Code veranschaulicht:

html.runtimeApplicationDomain = ApplicationDomain.currentDomain;

Wenn die runtimeApplicationDomain -Eigenschaft festgelegt wurde, verwendet der JavaScript-Kontext die gleichen Klassendefinitionen wie die zugewiesene Domäne. Um eine Instanz einer benutzerdefinierten Klasse in JavaScript zu erstellen, verweisen Sie über die window.runtime -Eigenschaft auf die Klassendefinition und verwenden Sie den new -Operator:

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

Der HTML-Inhalt muss aus einer kompatiblen Sicherheitsdomäne stammen. Stammt der HTML-Inhalt aus einer anderen Sicherheitsdomäne als der zugewiesenen Anwendungsdomäne, verwendet die Seite stattdessen die Standardanwendungsdomäne. Wenn Sie zum Beispiel eine Remoteseite aus dem Internet laden, könnten Sie ApplicationDomain.currentDomain nicht als Anwendungsdomäne der Seite zuweisen.

Entfernen von Ereignisprozeduren

Wenn Sie Objekten außerhalb der aktuellen Seite, einschließlich Laufzeitobjekte in geladenem SWF-Inhalt und sogar auf anderen Seiten ausgeführte JavaScript-Objekte, JavaScript-Ereignisprozeduren hinzufügen, sollten Sie diese Ereignis-Listener beim Entladen der Datei immer entfernen. Andernfalls sendet der Ereignis-Listener das Ereignis an eine nicht mehr vorhandene Prozedurfunktion. In diesem Fall wird die folgende Fehlermeldung angezeigt: „The application attempted to reference a JavaScript object in an HTML page that is no longer loaded.“ (Die Anwendung hat versucht, auf ein JavaScript-Objekt in einer HTML-Seite zu verweisen, die nicht mehr geladen ist.) Durch Entfernen nicht benötigter Ereignisprozeduren kann AIR den zugehörigen Speicher freigeben. Weitere Informationen finden Sie unter Entfernen von Ereignis-Listenern auf navigierenden HTML-Seiten .