Definieren browserähnlicher Benutzeroberflächen für HTML-InhaltAdobe AIR 1.0 und höher JavaScript bietet mehrere APIs zur Steuerung des Fensters, in dem der HTML-Inhalt angezeigt wird. In AIR können diese APIs durch die Implementierung einer benutzerdefinierten HTMLHost-Klasse außer Kraft gesetzt werden. Erweitern der HTMLHost-KlasseWenn Ihre Anwendung beispielsweise mehrere HTMLLoader-Objekte in einer Benutzeroberfläche mit Registerkarten darstellt, sollten durch die von den geladenen HTML-Seiten vorgenommenen Titeländerungen nicht der Titel des Hauptfensters sondern die Bezeichnung der Registerkarte geändert werden. In ähnlicher Weise könnte der Code auf einen Aufruf von window.moveTo() reagieren und die Position des HTMLLoader-Objekts im übergeordneten Anzeigeobjektcontainer ändern, das HTMLLoader-Objekt enthaltende Fenster verschieben, nichts unternehmen oder etwas vollkommen anders ausführen. Mit der AIR-HTMLHost-Klasse werden die folgenden JavaScript-Eigenschaften und -Methoden gesteuert:
Wenn Sie ein HTMLLoader-Objekt mithilfe von new HTMLLoader() erstellen, sind die genannten JavaScript-Eigenschaften und -Methoden nicht aktiviert. Die HTMLHost-Klasse bietet eine browserähnliche Standardimplementierung dieser JavaScript-APIs. Außerdem können Sie die HTMLHost-Klasse erweitern, um das Verhalten anzupassen. Um ein HTMLHost-Objekt zu erstellen, das das Standardverhalten unterstützt, müssen Sie im HTMLHost-Konstruktor den defaultBehaviors-Parameter auf „true“ festlegen: var defaultHost:HTMLHost = new HTMLHost(true); Wenn Sie in AIR ein HTML-Fenster mithilfe der createRootWindow()-Methode der HTMLLoader-Klasse erstellen, wird automatisch eine HTMLHost-Instanz, die das Standardverhalten unterstützt, zugewiesen. Sie können das Verhalten des Host-Objekts ändern, indem Sie der htmlHost-Eigenschaft von „HTMLLoader“ eine andere HTMLHost-Implementierung zuweisen, oder Sie können die Funktionen durch Zuweisen von null vollständig deaktivieren. Hinweis: Dem ersten für eine HTML-basierte AIR-Anwendung erstellten Fenster und jedem Fenster, das durch die Standardimplementierung der JavaScript-Methode window.open() erstellt wird, wird von AIR ein HTMLHost-Standardobjekt zugewiesen.
Beispiel: Erweitern der HTMLHost-KlasseDas folgende Beispiel zeigt, wie Sie die Wirkungsweise eines HTMLLoader-Objekts auf die Benutzeroberfläche durch das Erweitern der HTMLHost-Klasse anpassen können: Flex-Beispiel:
Um den hier beschriebenen Code zu prüfen, schließen Sie eine HTML-Datei mit dem folgenden Inhalt in das Anwendungsverzeichnis ein: <html>
<head>
<title>Test</title>
</head>
<script>
function openWindow()
{
window.runtime.trace("in");
document.title = "foo"
window.open('Test.html');
window.runtime.trace("out");
}
</script>
<body>
<a href="#" onclick="openWindow()">window.open('Test.html')</a>
</body>
</html>
Flash Professional-Beispiel:
Verarbeiten von Änderungen an der window.location-EigenschaftSetzen Sie die locationChange()-Methode außer Kraft, um Änderungen an der URL der HTML-Seite zu verarbeiten. Die locationChange()-Methode wird aufgerufen, wenn der Wert von window.location durch JavaScript in einer Seite geändert wird. Im folgenden Beispiel wird einfach die angeforderte URL geladen: override public function updateLocation(locationURL:String):void
{
htmlLoader.load(new URLRequest(locationURL));
}
Hinweis: Mit der htmlLoader-Eigenschaft des HTMLHost-Objekts können Sie auf das aktuelle HTMLLoader-Objekt verweisen.
Verarbeiten von JavaScript-Aufrufen von „window.moveBy()“, „window.moveTo()“, „window.resizeTo()“, „window.resizeBy()“Setzen Sie die set windowRect()-Methode außer Kraft, um Änderungen an den Begrenzungen des HTML-Inhalts zu verarbeiten. Die set windowRect()-Methode wird aufgerufen, wenn window.moveBy(), window.moveTo(), window.resizeTo() oder window.resizeBy() durch das JavaScript einer Seite aufgerufen wird. Im folgenden Beispiel werden einfach die Begrenzungen des Desktop-Fensters aktualisiert: override public function set windowRect(value:Rectangle):void
{
htmlLoader.stage.nativeWindow.bounds = value;
}
Verarbeiten von JavaScript-Aufrufen von „window.open()“Setzen Sie die createWindow()-Methode außer Kraft, um Aufrufe von window.open() durch JavaScript zu verarbeiten. Implementierungen der createWindow()-Methode sorgen für das Erstellen und Zurückgeben eines neuen HTMLLoader-Objekts. „HTMLLoader“ wird in der Regel in einem neuen Fenster angezeigt, aber es ist nicht erforderlich, ein neues Fenster zu erstellen. Das folgende Beispiel illustriert, wie die createWindow()-Funktion mithilfe von HTMLLoader.createRootWindow() implementiert wird, um sowohl das Fenster als auch das HTMLLoader-Objekt zu erstellen. Alternativ können Sie auch separat ein NativeWindow-Objekt erstellen und „HTMLLoader“ zur Fensterbühne hinzufügen. override public function createWindow(windowCreateOptions:HTMLWindowCreateOptions):HTMLLoader{
var initOptions:NativeWindowInitOptions = new NativeWindowInitOptions();
var bounds:Rectangle = new Rectangle(windowCreateOptions.x, windowCreateOptions.y,
windowCreateOptions.width, windowCreateOptions.height);
var htmlControl:HTMLLoader = HTMLLoader.createRootWindow(true, initOptions,
windowCreateOptions.scrollBarsVisible, bounds);
htmlControl.htmlHost = new HTMLHostImplementation();
if(windowCreateOptions.fullscreen){
htmlControl.stage.displayState = StageDisplayState.FULL_SCREEN_INTERACTIVE;
}
return htmlControl;
}
Hinweis: In diesem Beispiel wird die benutzerdefinierte HTMLHost-Implementierung jedem neuen Fenster, das mit window.open() erstellt wird, zugewiesen. Alternativ können Sie auch eine andere Implementierung verwenden oder die htmlHost-Eigenschaft für neue Fenster auf „null“ setzen.
Das Objekt, das als Parameter an die createWindow()-Methode übergeben wird, ist ein HTMLWindowCreateOptions-Objekt. Die HTMLWindowCreateOptions-Klasse enthält Eigenschaften, die die im features-Parameterstring im Aufruf von window.open() festgelegten Werte melden:
Von der HTMLLoader-Klasse werden nicht alle Funktionen implementiert, die im Funktionsstring angegeben werden können. Die Anwendung muss bei Bedarf Bildlaufleisten, Adressleisten, Menüleisten, Statusleisten und Symbolleisten bieten. Die anderen Argumente der window.open()-Methode von JavaScript werden vom System verarbeitet. Mit einer createWindow()-Implementierung sollte kein Inhalt in das HTMLLoader-Objekt geladen oder der Fenstertitel festgelegt werden. Verarbeiten von JavaScript-Aufrufen von „window.close()“Setzen Sie die windowClose()-Methode außer Kraft, um Aufrufe der window.close()-Methode durch JavaScript zu verarbeiten. Im folgenden Beispiel wird das Desktop-Fenster geschlossen, wenn die window.close()-Methode aufgerufen wird: override public function windowClose():void
{
htmlLoader.stage.nativeWindow.close();
}
Bei JavaScript-Aufrufen von window.close() muss das enthaltende Fenster nicht geschlossen werden. Im folgenden Beispiel wird gezeigt, wie Sie „HTMLLoader“ aus der Anzeigeliste entfernen und das Fenster (das weiteren Inhalt enthalten kann) offen lassen: override public function windowClose():void
{
htmlLoader.parent.removeChild(htmlLoader);
}
Verarbeiten von Änderungen an der window.status-EigenschaftSetzen Sie die updateStatus()-Methode außer Kraft, um Änderungen am Wert von window.status durch JavaScript zu verarbeiten. In diesem Beispiel wird der Statuswert ermittelt: override public function updateStatus(status:String):void
{
trace(status);
}
Der angeforderte Status wird als String an die updateStatus()-Methode übergeben. Das HTMLLoader-Objekt bietet keine Statusleiste. Verarbeiten von Änderungen an der window.document.title-EigenschaftSetzen Sie die updateTitle()-Methode außer Kraft, um Änderungen am Wert von window.document.title durch JavaScript zu verarbeiten. Im folgenden Beispiel wird der Fenstertitel geändert und der String "Sample" wird an den Titel angehängt: override public function updateTitle(title:String):void
{
htmlLoader.stage.nativeWindow.title = title + " - Sample";
}
Wenn document.title auf einer HTML-Seite festgelegt ist, wird der angeforderte Titel als String an die updateTitle()-Methode übergeben. Durch Änderungen an document.title muss nicht unbedingt auch der Titel des Fensters geändert werden, in dem das HTMLLoader-Objekt enthalten ist. Sie können beispielsweise ein anderes Element der Benutzeroberfläche, wie etwa ein Textfeld, ändern. Verarbeiten von JavaScript-Aufrufen von „window.blur()“ und „window.focus()“Setzen Sie die windowBlur()- und windowFocus()-Methoden außer Kraft, um Aufrufe der window.blur()- und window.focus()-Methoden durch JavaScript zu verarbeiten (siehe folgendes Beispiel): override public function windowBlur():void
{
htmlLoader.alpha = 0.5;
}
override public function windowFocus():void
{
htmlLoader.alpha = 1.0;
NativeApplication.nativeApplication.activate(htmlLoader.stage.nativeWindow);
}
Hinweis: AIR bietet keine API zum Deaktivieren eines Fensters oder einer Anwendung.
Erstellen von Fenstern mit HTML-Inhalt und BildlaufDie HTMLLoader-Klasse enthält die statische Methode HTMLLoader.createRootWindow(). Diese Methode ermöglicht es, ein neues Fenster (durch ein NativeWindow-Objekt dargestellt) zu öffnen, das ein HTMLLoader-Objekt enthält. Außerdem können Sie einige Benutzeroberflächeneinstellungen für das Fenster festlegen. Mithilfe von vier Parametern der Methode können Sie die Benutzerschnittstelle definieren:
Im folgenden Beispiel wird mithilfe der HTMLLoader.createRootWindow()-Methode ein Fenster mit HTMLLoader-Inhalt und Bildlaufleisten erstellt: var initOptions:NativeWindowInitOptions = new NativeWindowInitOptions();
var bounds:Rectangle = new Rectangle(10, 10, 600, 400);
var html2:HTMLLoader = HTMLLoader.createRootWindow(true, initOptions, true, bounds);
var urlReq2:URLRequest = new URLRequest("http://www.example.com");
html2.load(urlReq2);
html2.stage.nativeWindow.activate();
Hinweis: Fenster, die durch Aufrufen von createRootWindow() direkt in JavaScript erstellt werden, bleiben unabhängig vom öffnenden HTML-Fenster. Beispielsweise lautet der Wert der Fenstereigenschaften opener und parent von JavaScript null. Wenn Sie createRootWindow() jedoch indirekt aufrufen, indem Sie die createWindow()-Methode von „HTMLHost“ außer Kraft setzen, um createRootWindow() aufzurufen, verweisen opener und parent auf das öffnende HTML-Fenster.
|
|