Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Addio getURL e LoadVars

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
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
Link copiato negli appunti

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 dati
  • URLVariables 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.


Ti consigliamo anche