Ein Ereignis verarbeitendes System bietet Programmierern eine praktische Möglichkeit, auf Benutzereingaben und Systemereignisse zu reagieren. Das Adobe® AIR®-Ereignismodell ist nicht nur praktisch, sondern erfüllt auch relevante Standards. Basierend auf der Document Object Model (DOM) Level 3 Events Specification (eine Ereignis verarbeitende Architektur gemäß Branchenstandard), bietet das Ereignismodell Programmierern ein leistungsstarkes, intuitives Tool für die Ereignisverarbeitung.
HTMLLoader-Ereignisse
Ein HTMLLoader-Objekt löst die folgenden Adobe® ActionScript® 3.0-Ereignisse aus:
Ereignis
|
Beschreibung
|
htmlDOMInitialize
|
Wird ausgelöst, wenn das HTML-Dokument erstellt wird, aber bevor Skripts geparst oder DOM-Knoten zur Seite hinzugefügt werden.
|
complete
|
Wird ausgelöst, wenn das HTML-DOM als Reaktion auf einen Ladevorgang erstellt wurde, sofort nach dem
onload
-Ereignis in der HTML-Seite.
|
htmlBoundsChanged
|
Wird ausgelöst, wenn mindestens eine der Eigenschaften
contentWidth
und
contentHeight
geändert wurde.
|
locationChange
|
Wird ausgelöst, wenn die location-Eigenschaft des HTMLLoader geändert wurde.
|
locationChanging
|
Wird ausgelöst, bevor die HTMLLoader-Position sich nach einer Benutzernavigation, einem JavaScript-Aufruf oder einer Umleitung ändert. Das
locationChanging
-Ereignis wird nicht ausgelöst, wenn Sie die Methoden
load()
,
loadString()
,
reload()
,
historyGo()
,
historyForward()
oder
historyBack()
aufrufen.
Bei einem Aufruf der
preventDefault()
-Methode des ausgelösten Ereignisobjekts wird die Navigation abgebrochen.
Wenn ein Link im Systembrowser geöffnet wird, wird kein locationChanging-Ereignis ausgelöst, da die HTMLLoader-Position sich nicht ändert.
|
scroll
|
Wird ausgelöst, wenn die HTML-Engine die Bildlaufposition ändert. Scroll-Ereignisse können wegen der Navigation zu Anker-Links (
#
-Links) auf der Seite oder aufgrund von Aufrufen der
window.scrollTo()
-Methode auftreten. Die Eingabe von Text in ein Texteingabefeld oder einen Textbereich kann ebenfalls ein scroll-Ereignis auslösen.
|
uncaughtScriptException
|
Wird ausgelöst, wenn eine JavaScript-Ausnahme im HTMLLoader auftritt und die Ausnahme im JavaScript-Code nicht abgefangen wird.
|
Sie können auch eine ActionScript-Funktion für ein JavaScript-Ereignis (zum Beispiel
onClick
) registrieren. Ausführliche Informationen finden Sie unter
Verarbeiten von DOM-Ereignissen mit ActionScript
.
Verarbeiten von DOM-Ereignissen mit ActionScript
Sie können ActionScript-Funktionen registrieren, um auf JavaScript-Ereignisse zu reagieren. Betrachten Sie zum Beispiel folgenden HTML-Inhalt:
<html>
<body>
<a href="#" id="testLink">Click me.</a>
</html>
Sie können eine ActionScript-Funktion als eine Prozedur für jedes beliebige Ereignis auf der Seite registrieren. Der folgende Code fügt zum Beispiel die
clickHandler()
-Funktion als Listener für das
onclick
-Ereignis des
testLink
-Elements auf der HTML-Seite hinzu:
var html:HTMLLoader = new HTMLLoader( );
var urlReq:URLRequest = new URLRequest("test.html");
html.load(urlReq);
html.addEventListener(Event.COMPLETE, completeHandler);
function completeHandler(event:Event):void {
html.window.document.getElementById("testLink").onclick = clickHandler;
}
function clickHandler( event:Object ):void {
trace("Event of type: " + event.type );
}
Das ausgelöste Ereignisobjekt hat nicht den Typ flash.events.Event oder einer der Event-Unterklassen. Verwenden Sie die Object-Klasse, um einen Typ für das Ereignisprozedurfunktionsargument zu deklarieren.
Sie können diese Ereignisse auch mit der
addEventListener()
-Methode registrieren. Die
completeHandler()
-Methode im oben aufgeführten Beispiel lässt sich zum Beispiel durch den folgenden Code ersetzen:
function completeHandler(event:Event):void {
var testLink:Object = html.window.document.getElementById("testLink");
testLink.addEventListener("click", clickHandler);
}
Wenn ein Listener sich auf ein bestimmtes DOM-Element bezieht, hat es sich bewährt, zu warten, bis der übergeordnete HTMLLoader das
complete
-Ereignis auslöst, bevor die Ereignis-Listener hinzugefügt werden. HTML-Seiten laden häufig mehrere Dateien und das HTML-DOM wird nicht vollständig aufgebaut, bevor alle Dateien geladen und geparst wurden. Der HTMLLoader löst das
complete
-Ereignis aus, wenn alle Elemente erstellt wurden.
Antworten auf nicht erfasste JavaScript-Ausnahmen
Betrachten Sie den folgenden HTML-Code:
<html>
<head>
<script>
function throwError() {
var x = 400 * melbaToast;
}
</script>
</head>
<body>
<a href="#" onclick="throwError()">Click me.</a>
</html>
Er enthält eine JavaScript-Funktion,
throwError()
, die auf eine unbekannte Variable verweist,
melbaToast
:
var x = 400 * melbaToast;
Wenn eine JavaScript-Operation einen unzulässigen Vorgang erkennt, der im JavaScript-Code nicht mit einer
try
/
catch
-Struktur erfasst wird, löst das HTMLLoader-Objekt, das die Seite enthält, ein HTMLUncaughtScriptExceptionEvent-Ereignis aus. Sie können eine Prozedur für dieses Ereignis registrieren wie im folgenden Code:
var html:HTMLLoader = new HTMLLoader();
var urlReq:URLRequest = new URLRequest("test.html");
html.load(urlReq);
html.width = container.width;
html.height = container.height;
container.addChild(html);
html.addEventListener(HTMLUncaughtScriptExceptionEvent.UNCAUGHT_SCRIPT_EXCEPTION,
htmlErrorHandler);
function htmlErrorHandler(event:HTMLUncaughtJavaScriptExceptionEvent):void
{
event.preventDefault();
trace("exceptionValue:", event.exceptionValue)
for (var i:int = 0; i < event.stackTrace.length; i++)
{
trace("sourceURL:", event.stackTrace[i].sourceURL);
trace("line:", event.stackTrace[i].line);
trace("function:", event.stackTrace[i].functionName);
}
}
In JavaScript können Sie dasselbe Ereignis mit der window.htmlLoader-Eigenschaft verarbeiten:
<html>
<head>
<script language="javascript" type="text/javascript" src="AIRAliases.js"></script>
<script>
function throwError() {
var x = 400 * melbaToast;
}
function htmlErrorHandler(event) {
event.preventDefault();
var message = "exceptionValue:" + event.exceptionValue + "\n";
for (var i = 0; i < event.stackTrace.length; i++){
message += "sourceURL:" + event.stackTrace[i].sourceURL +"\n";
message += "line:" + event.stackTrace[i].line +"\n";
message += "function:" + event.stackTrace[i].functionName + "\n";
}
alert(message);
}
window.htmlLoader.addEventListener("uncaughtScriptException", htmlErrorHandler);
</script>
</head>
<body>
<a href="#" onclick="throwError()">Click me.</a>
</html>
Das
htmlErrorHandler()
-Ereignis bricht das Standardverhalten des Ereignisses (das im Senden der JavaScript-Fehlermeldung an die AIR-Trace-Ausgabe besteht) ab und generiert seine eigene Ausgabemeldung. Ausgegeben wird der Wert von
exceptionValue
des HTMLUncaughtScriptExceptionEvent-Objekts. Im
stackTrace
-Array werden die Eigenschaften aller Objekte ausgegeben:
exceptionValue: ReferenceError: Can't find variable: melbaToast
sourceURL: app:/test.html
line: 5
function: throwError
sourceURL: app:/test.html
line: 10
function: onclick
Verarbeiten von Laufzeitereignissen mit JavaScript
Die Laufzeitklassen unterstützen das Hinzufügen von Ereignis-Prozeduren mit der
addEventListener()
-Methode. Um eine Prozedurfunktion für ein Ereignis hinzuzufügen, rufen Sie die
addEventListener()
-Methode des Objekts auf, das das Ereignis auslöst, und geben Sie dabei den Ereignistyp und die Prozedurfunktion an. Um zum Beispiel auf das
closing
-Ereignis zu warten, das ausgelöst wird, wenn ein Benutzer auf das Schließen-Feld in der Titelleiste eines Fensters klickt, verwenden Sie die folgende Anweisung:
window.nativeWindow.addEventListener(air.NativeWindow.CLOSING, handleWindowClosing);
Erstellen einer Ereignisprozedurfunktion
Mit dem folgenden Code wird eine einfache HTML-Datei erstellt, die Informationen über die Position des Hauptfensters anzeigt. Eine Prozedurfunktion,
moveHandler()
, wartet auf ein move-Ereignis (von der NativeWindowBoundsEvent-Klasse definiert) des Hauptfensters.
<html>
<script src="AIRAliases.js" />
<script>
function init() {
writeValues();
window.nativeWindow.addEventListener(air.NativeWindowBoundsEvent.MOVE,
moveHandler);
}
function writeValues() {
document.getElementById("xText").value = window.nativeWindow.x;
document.getElementById("yText").value = window.nativeWindow.y;
}
function moveHandler(event) {
air.trace(event.type); // move
writeValues();
}
</script>
<body onload="init()" />
<table>
<tr>
<td>Window X:</td>
<td><textarea id="xText"></textarea></td>
</tr>
<tr>
<td>Window Y:</td>
<td><textarea id="yText"></textarea></td>
</tr>
</table>
</body>
</html>
Wenn ein Benutzer das Fenster verschiebt, zeigen die Textfeldelemente die aktualisierten X- und Y-Positionen des Fensters an:
Beachten Sie, dass das Ereignisobjekt als Argument an die
moveHandler()
-Methode übergeben wird. Der event-Parameter ermöglicht der Prozedurfunktion, das Ereignisobjekt zu überprüfen. In diesem Beispiel verwenden Sie die
type
-Eigenschaft des Ereignisobjekts, um zu melden, dass es sich bei dem Ereignis um ein
move
-Ereignis handelt.
Entfernen von Ereignisprozeduren
Mit der
removeEventListener()
-Methode können Sie einen Ereignis-Listener entfernen, den Sie nicht mehr benötigen. Es empfiehlt sich, alle nicht mehr benötigten Listener zu entfernen. Erforderliche Parameter sind
eventName
und
listener
, die identisch sind mit den erforderlichen Parametern für die
addEventListener()
-Methode.
Entfernen von Ereignis-Listenern auf navigierenden HTML-Seiten
Wenn HTML-Inhalt Navigationsvorgänge ausführt oder wenn HTML-Inhalt verworfen wird, da das Fenster mit dem Inhalt geschlossen wird, werden die Ereignis-Listener, die auf Objekte auf der entladenen Seite verweisen, nicht automatisch entfernt. Wenn ein Objekt ein Ereignis für eine Prozedur auslöst, die bereits entladen wurde, 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 auf einer HTML-Seite zu verweisen, die nicht mehr geladen ist.)
Um diesen Fehler zu vermeiden, entfernen Sie JavaScript-Ereignis-Listener auf einer HTML-Seite, bevor sie entladen wird. Bei der Seitennavigation (in einem HTMLLoader-Objekt) entfernen Sie den Ereignis-Listener während des
unload
-Ereignisses des
window
-Objekts.
Mit dem folgenden JavaScript-Code wird ein Ereignis-Listener für ein
uncaughtScriptException
-Ereignis entfernt:
window.onunload = cleanup;
window.htmlLoader.addEventListener('uncaughtScriptException', uncaughtScriptException);
function cleanup()
{
window.htmlLoader.removeEventListener('uncaughtScriptException',
uncaughtScriptExceptionHandler);
}
Damit der Fehler nicht beim Schließen von Fenstern mit HTML-Inhalt auftritt, rufen Sie eine Bereinigungsfunktion als Reaktion auf das
closing
-Ereignis des NativeWindow-Objekts (
window.nativeWindow
) auf. Mit dem folgenden JavaScript-Code wird ein Ereignis-Listener für ein
uncaughtScriptException
-Ereignis entfernt:
window.nativeWindow.addEventListener(air.Event.CLOSING, cleanup);
function cleanup()
{
window.htmlLoader.removeEventListener('uncaughtScriptException',
uncaughtScriptExceptionHandler);
}
Sie können diesen Fehler auch verhindern, indem Sie einen Ereignis-Listener entfernen, sobald er ausgeführt wird (falls das Ereignis nur einmal verarbeitet werden muss). Mit dem folgenden JavaScript-Code wird zum Beispiel ein Html-Fenster erstellt, indem die
createRootWindow()
-Methode der HTMLLoader-Klasse aufgerufen und ein Ereignis-Listener für das
complete
-Ereignis aufgerufen wird. Wenn die
complete
-Ereignisprozedur aufgerufen wird, entfernt sie ihren eigenen Ereignis-Listener mit der
removeEventListener()
-Funktion:
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"));
Wenn Sie nicht mehr benötigte Ereignis-Listener entfernen, hat auch der Garbage Collector des Systems die Möglichkeit, den mit diesen Listenern belegten Speicher freizumachen.
Überprüfen auf vorhandene Ereignis-Listener
Mit der
hasEventListener()
-Methode können Sie prüfen, ob Ereignis-Listener für ein Objekt vorhanden sind.
|
|
|