Tra le numerose novità di Actionscript 3 c'è da annoverare l'eliminazione del comando getURL (comunemente usato per linkare pagine o siti web o per eseguire funzioni javascript presenti nella pagina web) e della classe LoadVars, utilizzata per inviare e caricare dati interagendo solitamente con linguaggi server-side come ASP.NET, PHP, JSP, ecc.
Nell'articolo vedremo come sostituire questi comandi e i relativi metodi per poter ottenere in Actionscript 3 ciò che LoadVars e getURL potevano fare in Actionscript 1 e 2.
Addio getURL, benvenuto navigateToURL
Il cambio di comando per quanto riguarda getURL
è piuttosto semplice, tuttavia non c'è una trasposizione "diretta", ovvero se prima veniva utilizzato:
getURL("http://flash.html.it","_blank")
ora non possiamo variare semplicemente in:
navigateToURL("http://flash.html.it","_blank")
Otterremmo infatti l'errore 1067: Implicit coercion of a value of type String to an unrelated type flash.net:URLRequest.
Questo perché il comando navigateToURL
richiede come parametro un oggetto di tipo URLRequest, è quindi necessario variare il codice così:
var indirizzo:URLRequest = new URLRequest("http://flash.html.it")
navigateToURL(indirizzo,"_blank")
I parametri del comando navigateToURL
sono analoghi a quelli del getURL
, il primo è l'indirizzo web da raggiungere (che però in questo caso è indicato come oggetto URLRequest
) mentre il secondo indica la finestra di destinazione; i possibili valori sono quattro:
- "_self": apre il collegamento nella finestra attuale (o nel frame attuale, in caso di finestra con più frame);
- "_blank": apre il collegamento in una nuove finestra;
- "_parent": apre il collegamento nella pagina "genitore" del frame attuale;
- "_top": apre il collegamento nella pagina al livello più alto della struttura di frame.
Se il secondo parametro viene omesso, di default come comportamento viene utilizzato quello affine al valore _blank
e viene quindi aperta una nuova finestra.
È possibile utilizzare il comando navigateToURL
anche per richiamare una funzione javascript, anche se per questo tipo di operazione è preferibile usare la classe ExternalInterface
, di cui abbiamo già parlato in un precedente articolo.
Il codice javascript può essere dichiarato all'interno del codice Actionscript, in questo modo:
var indirizzo:URLRequest = new URLRequest("javascript: alert('Messaggio dal Flash Player.')")
navigateToURL(indirizzo,"_self")
oppure richiamando una funzione inserita nella pagina HTML, dove il codice Actionscript sarà:
var indirizzo:URLRequest = new URLRequest("javascript:saluta()")
navigateToURL(indirizzo,"_self")
Mentre nella pagina HTML avremo la funzione javascript:
<script>
function saluta(){
window.alert('Messaggio dal Flash Player')
}
</script>
Notiamo in entrambi i casi l'utilizzo del parametro _self per evitare l'apertura di una nuova finestra.
È in conclusione molto semplice sostituire il comando getURL
in Actionscript 3, l'unica novità rilevante è la necessità di utilizzare un oggetto URLRequest
per specificare l'indirizzo; proprio URLRequest
viene utilizzato anche nella sostituzione della classe LoadVars
.
URLLoader e URLRequest, i successori di LoadVars
I cambiamenti nel caso dell'invio e caricamento di dati sono maggiori, infatti non cambiano solamente i comandi da utilizzare ma anche l'approccio è diverso poiché Actionscript 3 utilizza il sistema degli eventi, pertanto quello che in Actionscript 2 sarebbe stato:
var carica:LoadVars = new LoadVars()
carica.onLoad = function(){
// azioni
}
carica.load("http://www.sito.it/pagina.php")
In Actionscript 3 viene tradotto con:
var indirizzo:URLRequest = new URLRequest("http://www.sito.it/pagina.php")
var carica:URLLoader = new URLLoader()
carica.load(indirizzo)
carica.addEventListener(Event.COMPLETE,analizza)
function analizza(evt){
trace(evt.target.data)
}
Per prima cosa notiamo come l'url venga passato anche in questo caso tramite oggetto URLRequest
, come già visto per il comando navigateToURL
; notiamo anche l'utilizzo dell'evento COMPLETE che praticamente sostituisce il "vecchio" metodo onLoad.
L'evento COMPLETE
viene lanciato una volta completato il caricamento dei dati esterni e richiama la funzione passata come parametro, in questo caso analizza. Tale funzione prevede a sua volta un parametro (evt) da cui possiamo ricavare l'oggetto che ha scatenato l'evento (evt.target) e la relativa proprietà data, contenente proprio i dati ricavati dalla pagina esterna (evt.target.data).
Possiamo facilmente dividere le variabili restituite dallo script esterno usando la classe URLVariables, variando il codice in questo modo:
var indirizzo:URLRequest = new URLRequest("http://www.sito.it/pagina.php")
var carica:URLLoader = new URLLoader()
carica.load(indirizzo)
carica.addEventListener(Event.COMPLETE,analizza)
function analizza(evt){
var variabili:URLVariables = new URLVariables(evt.target.data)
}
Potremo quindi accedere alle singole variabili usando la sintassi variabili.nomevariabile, dove variabili è l'oggetto di tipo URLVariables
che abbiamo creato mentre nomevariabile è il nome della variabile restituita dalla pagina esterna.
La classe LoadVars
prevedeva anche i metodi send (per l'invio di dati) e sendAndLoad (per l'invio di dati e la ricezione della successiva risposta). Il metodo send
viene sostituito dalla classe URLRequest
, mentre per quanto riguarda il sendAndLoad
diventa necessario l'utilizzo di due comandi distinti (sendToURL e load).s
Per l'invio dei dati ad una pagina web, qualora non vi sia la necessità di una risposta da parte del server, la classe LoadVars prevede la seguente sintassi:
var invia:LoadVars = new LoadVars()
invia.nomevariabile = "valore"
invia.nomevariabile2 = "valore 2"
invia.send("http://www.sito.it/pagina.php")
Notiamo come le variabili e i relativi valori vengano aggiunti direttamente nell'oggetto invia
.
Actionscript 3 sfrutta il metodo sendToURL della classe URLRequest
per inviare i dati e sfrutta la classe URLVariables per inserire le variabili e i rispettivi valori, come nel codice seguente:
var invia:URLRequest = new URLRequest("http://www.sito.it/pagina.php")
var variabili:URLVariables = new URLVariables()
variabili.variabile = "valore"
variabili.variabile2 = "valore2"
invia.data = variabili
sendToURL(invia)
Come detto abbiamo l'utilizzo di due diverse classi:
URLRequest
per l'inserimento dell'indirizzo a cui inviare i datiURLVariables
per la creazione dell'oggetto contenente le variabili e i relativi valori; tale oggetto viene passato alla variabile data dell'URLRequest, quindi i dati vengono inviati alla pagina desiderata tramite il comando sendToURL.
È possibile utilizzare eventualmente il comando invia.method = "POST" per stabilire il metodo (GET o POST) di invio delle variabili allo script esterno.
Per quanto concerne la sostituzione del comando sendAndLoad l'operazione diventa più complessa, in quanto con Actionscript 3, come abbiamo detto, è necessario utilizzare il metodo sendToURL della classe URLRequest
e il metodo load della classe URLLoader
; in poche parole operiamo una sorta di "unione" dei due script visti in precedenza, in questo modo:
var invia:URLRequest = new URLRequest("http://www.sito.it/pagina.php")
var variabili:URLVariables = new URLVariables()
variabili.variabile = "valore"
variabili.variabile2 = "valore2"
invia.data = variabili
invia.method = "POST"
sendToURL(invia)
var carica:URLLoader = new URLLoader()
carica.load(invia)
carica.addEventListener(Event.COMPLETE,analizza)
function analizza(evt){
var variabili_ricevute:URLVariables = new URLVariables(evt.target.data)
}
In questo modo operiamo un invio dei dati e una successiva ricezione che ci consentono di ricavare le variabili elaborate dalla pagina esterna.
Sicuramente i comandi di Actionscript 3 risultano maggiormente "prolissi", specialmente nel caso del sendAndLoad
che con LoadVars
sarebbe stato di questo tipo:
var invia:LoadVars = new LoadVars()
invia.variabile = "valore"
invia.variabile2 = "valore2"
invia.onLoad = function(){
// azioni
}
invia.sendAndLoad("http://www.sito.it/pagina.php",this,"POST")
Tuttavia in Actionscript 3 abbiamo una maggior suddivisione dei passaggi logici eseguiti e soprattutto un controllo più elevato su quanto succede nell'invio e ricezione dei dati, grazie all'utilizzo degli eventi, è infatti possibile usare per esempio l'evento IOErrorEvent.IO_ERROR per intercettare un errore, così:
var invia:URLRequest = new URLRequest("http://www.sito.it/pagina.php")
var variabili:URLVariables = new URLVariables()
variabili.variabile = "valore"
variabili.variabile2 = "valore2"
invia.data = variabili
invia.method = "POST"
sendToURL(invia)
var carica:URLLoader = new URLLoader()
carica.load(invia)
carica.addEventListener(Event.COMPLETE,analizza)
carica.addEventListener(IOErrorEvent.IO_ERROR,errore)
function analizza(evt){
var variabili_ricevute:URLVariables = new URLVariables(evt.target.data)
}
function errore(evt){
trace("Errore di input/output")
}
Ne consegue la possibilità di avere una maggior "robustezza" nel codice e nell'applicazione stessa, potendo creare progetti in grado di "reagire" a determinati errori con messaggi di avviso o comportamenti particolari, piuttosto che rimanere bloccati a causa della mancanza di un dato di ritorno. Possiamo quindi dire che il tempo in più necessario per la stesura del codice è ampiamente ricompensato da un minor tempo di debug e un minor numero di possibili situazioni che causino lo stallo dell'applicazione.