JavaScript in the HTML page loaded
by an HTMLLoader object can call the classes, objects, and functions
defined in the ActionScript execution context using the
window.runtime
,
window.htmlLoader
,
and
window.nativeWindow
properties of the HTML
page. You can also make ActionScript objects and functions available
to JavaScript code by creating references to them within the JavaScript
execution context.
A basic example of accessing JavaScript objects from ActionScript
The
following example illustrates how to add properties referencing
ActionScript objects to the global window object of an HTML page:
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;
}
The
HTML content (in a file named test.html) loaded into the HTMLLoader
object in the previous example can access the
foo
property
and the
helloFromJS()
method defined in the parent
SWF file:
<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>
When
accessing the JavaScript context of a loading document, you can
use the
htmlDOMInitialize
event to create objects
early enough in the page construction sequence that any scripts
defined in the page can access them. If you wait for the
complete
event,
only scripts in the page that run after the page
load
event
can access the added objects.
Making class definitions available to JavaScript
To make the ActionScript
classes of your application available in JavaScript, you can assign
the loaded HTML content to the application domain containing the class
definitions. The application domain of the JavaScript execution
context can be set with the
runtimeApplicationDomain
property
of the HTMLLoader object. To set the application domain to the primary
application domain, for example, set
runtimeApplicationDomain
to
ApplicationDomain.currentDomain
,
as shown in the following code:
html.runtimeApplicationDomain = ApplicationDomain.currentDomain;
Once
the
runtimeApplicationDomain
property is set, the
JavaScript context shares class definitions with the assigned domain.
To create an instance of a custom class in JavaScript, reference
the class definition through the
window.runtime
property
and use the
new
operator:
var customClassObject = new window.runtime.CustomClass();
The
HTML content must be from a compatible security domain. If the HTML
content is from a different security domain than that of the application
domain you assign, the page uses a default application domain instead.
For example, if you load a remote page from the Internet, you could
not assign ApplicationDomain.currentDomain as the application domain of
the page.
Removing event listeners
When you add
JavaScript event listeners to objects outside the current page, including
runtime objects, objects in loaded SWF content, and even JavaScript objects
running in other pages, you should always remove those event listeners when
the page unloads. Otherwise, the event listener dispatches the event
to a handler function that no longer exists. If this happens, you
will see the following error message: “The application attempted
to reference a JavaScript object in an HTML page that is no longer
loaded." Removing unneeded event listeners also lets AIR reclaim
the associated memory. For more information, see
Removing event listeners in HTML pages that navigate
.
|
|
|