Gestione di eventi relativi a HTML in AIRAdobe AIR 1.0 e versioni successive Un sistema di gestione degli eventi permette ai programmatori di elaborare risposte adeguate all'input degli utenti e agli eventi del sistema. Il modello di eventi di Adobe® AIR® non è solo utile, ma anche conforme agli standard. Questo modello di eventi, che si basa sulla specifica DOM (Document Object Model) Level 3, un'architettura di gestione degli eventi considerata uno standard del settore, è uno strumento di gestione degli eventi efficace e al contempo intuitivo dedicato ai programmatori. Eventi HTMLLoaderUn oggetto HTMLLoader invia i seguenti eventi di Adobe® ActionScript® 3.0:
È possibile inoltre registrare una funzione ActionScript per un evento JavaScript (come onClick). Per informazioni dettagliate, consultate Gestione di eventi DOM con ActionScript. Gestione di eventi DOM con ActionScriptÈ possibile registrare le funzioni ActionScript per rispondere a eventi JavaScript. Ad esempio, considerate il seguente elemento HTML: <html>
<body>
<a href="#" id="testLink">Click me.</a>
</html>
È possibile registrare una funzione ActionScript come gestore di qualsiasi evento nella pagina. Ad esempio, il codice seguente aggiunge la funzione clickHandler() come listener per l'evento onclick dell'elemento testLink nella pagina HTML: 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 );
}
L'oggetto evento inviato non è del tipo flash.events.Event o una delle sottoclassi Event. Utilizzate la classe Object per dichiarare un tipo per l'argomento della funzione di gestione degli eventi. È possibile utilizzare inoltre il metodo addEventListener() per registrare per questi eventi. Ad esempio, è possibile sostituire il metodo completeHandler() nell'esempio precedente con il codice seguente: function completeHandler(event:Event):void {
var testLink:Object = html.window.document.getElementById("testLink");
testLink.addEventListener("click", clickHandler);
}
Quando un listener fa riferimento a un elemento DOM specifico, è consigliabile attendere il principale HTMLLoader per inviare l'evento complete prima di aggiungere i listener di eventi. Le pagine HTML spesso caricano più file e l'HTML DOM non è completamente realizzato finché tutti i file non vengono caricati e analizzati. L'HTMLLoader invia l'elemento complete quando sono stati creati tutti gli elementi. Risposta a eccezioni JavaScript non identificateConsiderate il seguente codice HTML: <html>
<head>
<script>
function throwError() {
var x = 400 * melbaToast;
}
</script>
</head>
<body>
<a href="#" onclick="throwError()">Click me.</a>
</html>
Contiene una funzione JavaScript, throwError(), che fa riferimento a una variabile sconosciuta, melbaToast: var x = 400 * melbaToast; Quando un'operazione JavaScript rileva un'operazione errata che non è identificata nel codice JavaScript con un struttura try/catch, l'oggetto HTMLLoader contenente la pagina invia un evento HTMLUncaughtScriptExceptionEvent. È possibile registrare un gestore per questo evento, come nel codice seguente: 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, è possibile gestire lo stesso evento mediante la proprietà window.htmlLoader: <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>
Il gestore eventi htmlErrorHandler() annulla il comportamento predefinito dell'evento (che deve inviare il messaggio di errore di JavaScript alcun output di tracciamento AIR) e genera il relativo messaggio di output. Emette il valore di exceptionValue dell'oggetto HTMLUncaughtScriptExceptionEvent. Emette la proprietà di ciascun oggetto nell'array stackTrace: exceptionValue: ReferenceError: Can't find variable: melbaToast sourceURL: app:/test.html line: 5 function: throwError sourceURL: app:/test.html line: 10 function: onclick Gestione di eventi runtime con JavaScriptLe classi runtime supportano altri gestori di eventi con il metodo addEventListener(). Per aggiungere una funzione di gestore per un evento, chiamate il metodo addEventListener() dell'oggetto che invia l'evento, offrendo il tipo di evento e la funzione di gestione. Ad esempio, per intercettare l'evento closing inviato quando un utente fa clic sul pulsante di chiusura della finestra nella barra del titolo, utilizzate la seguente istruzione: window.nativeWindow.addEventListener(air.NativeWindow.CLOSING, handleWindowClosing); Creazione di una funzione di gestore eventiIl codice seguente crea un semplice file HTML che visualizza informazioni sulla posizione della finestra principale. Un funzione gestore denominata moveHandler() intercetta un evento di spostamento (definito dalla classe NativeWindowBoundsEvent) della finestra principale. <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>
Quando un utente sposta la finestra, gli elementi textarea visualizzano le posizioni X e Y aggiornate della finestra: Notate che l'oggetto evento viene passato come argomento al metodo moveHandler(). Il parametro evento consente alla funzione del gestore di esaminare l'oggetto evento. In questo esempio, si usa la proprietà type dell'oggetto evento per riportare che l'evento è un evento move. Eliminazione dei listener di eventiPer rimuovere i listener di eventi inutilizzati si può usare il metodo removeEventListener(). È buona norma rimuovere i listener diventati superflui. I parametri obbligatori sono eventName e listener, cioè gli stessi parametri del metodo addEventListener(). Rimozione di listener di eventi in pagine HTML visualizzateQuando si visualizza contenuto HTML o quando tale contenuto viene eliminato perché una finestra che lo contiene viene chiusa, i listener di eventi che fanno riferimento a oggetti presenti in una pagina non caricata vengono automaticamente rimossi. Quando un oggetto invia un evento a un gestore che è già stato caricato, viene visualizzato il seguente messaggio di errore: “The application attempted to reference a JavaScript object in an HTML page that is no longer loaded.” (L'applicazione ha tentato di fare riferimento a un oggetto JavaScript in un pagina HTML che non è più caricata). Per evitare questo errore, eliminare i listener di eventi JavaScript in una pagina HTML prima che scompaia. Nel caso di spostamento di pagine (in un oggetto HTMLLoader), eliminare il listener di eventi durante l'evento unload dell'oggetto window. Ad esempio, il seguente codice JavaScript rimuove un listener di eventi per un oggetto uncaughtScriptException: window.onunload = cleanup;
window.htmlLoader.addEventListener('uncaughtScriptException', uncaughtScriptException);
function cleanup()
{
window.htmlLoader.removeEventListener('uncaughtScriptException',
uncaughtScriptExceptionHandler);
}
Per evitare il verificarsi dell'errore quando si chiudono le finestre contenenti il contenuto HTML, chiamate una funzione di pulizia in risposta all'evento closing dell'oggetto NativeWindow (window.nativeWindow). Ad esempio, il seguente codice JavaScript rimuove un listener di eventi per un oggetto uncaughtScriptException: window.nativeWindow.addEventListener(air.Event.CLOSING, cleanup);
function cleanup()
{
window.htmlLoader.removeEventListener('uncaughtScriptException',
uncaughtScriptExceptionHandler);
}
Potete inoltre evitare questo errore eliminando un listener di eventi non appena viene eseguito (se l'evento deve essere gestito una sola volta). Ad esempio, il seguente codice JavaScript crea una finestra html chiamando il metodo createRootWindow() della classe HTMLLoader e aggiunge un listener di eventi per l'evento complete. Quando viene chiamato il gestore eventi complete, elimina il relativo listener di eventi mediante la funzione removeEventListener(): 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"));
La rimozione di listener di eventi non necessari consente inoltre che il garbage collector del sistema riutilizzi qualsiasi memoria associata a tali listener. |
|