getURL in Flash projector
// dicembre 16th, 2006 // Sviluppo e tips
Utilizzando il comando getURL() per aprire un file HTML da un SWF caricato tramite lo standalone Player di Flash (com ad esempio un projector EXE su un CD-rom) abbiamo riscontrato difficoltà di funzionamento soprattutto quando il browser predefinito è Firefox. Invocando il getURL(“modules/mia_pagina.html”) non viene aperta la pagina richiesta… vediamo perché…
Prendiamo in considerazione la situazione in cui un Flash projector (pubblicato come tale da Flash) contiene una chiamata di tipo getURL() a un file HTML: in questo modo non ci addentriamo nella casistica degli SWF in locale per i quali entra in ballo tutta la questione riguardante le security restrictions introdotte nelle varie versioni. Un movie Flash pubblicato come eseguibile invece non è soggetto a queste restrizioni di sicurezza come descritto nella documentazione ufficiale.
Detto questo procediamo con il nostro esempio e vediamo cosa succede quando un pulsante (che ha come instance name “myButton”) contenuto nel Flash projector invoca un getURL, o l’equivalente navigateToURL in AS3.0, a una pagina HTML:
myButton.onRelease = function() {
getURL("modules/mia_pagina.html", "_blank");
};
Se il browser predefinito sul computer dell’utente è Internet Explorer, o una versione di Netscape/Mozilla precedente Firefox, tendenzialmente il comando avrà effetto e si aprirà la pagina “mia_pagina.html”.
Però se il browser di default è Firefox allora succedono cose strane e imprevedibili: sulle piattaforme testate ad esempio capita che Firefox si apre con due tab di cui uno _blank e uno in cui viene visualizzata la pagina di ricerca di default (ad esempio Google).
Un bel problema! Così sono partite le miee ricerche e i test più svariati fino a capire che non si tratta di un bug del Flash Player ma di Firefox, o meglio, di come Firefox gestisce le Url passate sulla command line.
Chiudete tutti i browser e provate a scrivere sulla command line il comando:
firefox -url "http://www.yahoo.com/|http://www.google.com/"
Noterete che viene aperto Firefox con due tab: una per Yahoo e una per Google.
Torniamo a Flash ora… quando in un projector invochiamo un getURL(“modules/mia_pagina.html”, “_blank”), quindi a una pagina relativa, il Flash Player traduce questo path in assoluto. Se ad esempio il projector è su un CD-dom identificato con la lettera D, e il file mia_pagina.html posizionato nella directory “modules”, il path assoluto tradotto dal Flash Player sarà del tipo:
file:///D|modulesmia_pagina.html
Notate che è presente in questa stringa il carattere “|” (che si legge “pipe”) ed è proprio qui il problema. Quando Firefox riceve questo path, come nell’esempio fatto per la command line, cerca di aprire due tab e visualizzare le pagine specificate prima e dopo il “pipe”. Nel nostro caso tenterà di aprire senza successo le pagine “file:///d:” e “modulesmia_pagina.html” che, non essendoci corrispondenza con reali pagine, provocano l’errore.
La soluzione è quindi quella di tradurre il path assoluto da inviare al browser in modo da evitare la presenza del carattere “pipe” e l’insorgere del problema, che ricordiamo è limitato solo agli utenti Firefox… ma come ben sappiamo sono (siamo) una crescente realta da non sottovalutare.
Per fare questo ci viene in aiuto la proprietà _url di AS2.0 o la proprieà url di loaderInfo in AS3.0). Per un SWF in una pagina web questa proprietà corrisponde alla url del file SWF, mentre per un SWF standalone in locale come un projector/eseguibile questo restituisce il path assoluto “file:///” dell’SWF nel file system.
Facciamo una prova e creiamo un projector SWF con un textField sullo stage a cui diamo come instance name “tf”:
// AS2 tf.text = this._url; // AS3 tf.text = this.loaderInfo.url;
Facendo un test nel nostro textField apparirà un testo tipo: “file:///D|/projector.exe”.
Quindi quello che dovremo fare nel nostro caso è sostituire il “pipe” con “:” e il nome del projector con il percorso relativo al file HTML da aprire. Ci facciamo aiutare da indexOf() e lastIndexOf() per individuare rispettivamente la posizione del carattere “pipe” | e dellultimo slash (/) che chiude il path del projector. Ed ecco il codice risultante in Actionscript 2.0:
var swfUrl:String = _root._url;
var lastSlashIndex:Number = swfUrl.lastIndexOf("/");
var pipeIndex:Number = swfUrl.indexOf("|");
var baseUrl:String;
if (pipeIndex >= 0) {
baseUrl = swfUrl.substring(0, pipeIndex);
baseUrl += ":";
} else {
baseUrl = "";
}
baseUrl += swfUrl.substring(pipeIndex + 1, lastSlashIndex + 1);
myButton.onRelease = function() {
var targetUrl:String = baseUrl + "modules/mia_pagina.html";
getURL(targetUrl, "_blank");
};


















Grazie della dritta! Spiegazione esauriente e non prolissa. Complimenti!
Spiegazione perfetta per un baco di firefox che mi stava spaccando la testa già da un paio di ore… Grazie, e inserito il sito nei preferiti ;-)
Ciao, ho provato come hai detto, ho cerato un proiettore flash al quale linko una pagina .html ma con firefox non funziona……
mi da questo problema:
file:///CDP/Users/michele/Desktop/05.html
se elimino una slash invece funziona
file://CDP/Users/michele/Desktop/05.html
se invece di creare un proiettore creo un swf funziona perfettamente………mi puoi aiutare grazie
premetto che ho bisogno di lavorare il locale……:)
Ciao Michele, sarebbe utile capire che versione di Firefox stai utilizzando. Non ho più testato questo script con le ultime versioni di Firefox. Ho fatto un velocissimo test e su Firefox 3.0.x sembra che le cose siano cambiate infatti facendo il test della command line che descrivo nel post si ha un comportamento diverso. Sembra proprio che abbiano cambiato il modo di intendere il “pipe” che dava origine al problema.
Secondo me hai un problema diverso prova a descrivere la tua situazione.
Ciao Cristian,
anche io ho un problema simile.
Ho un file .exe realizzato con flash fullsize. A fine animazione ho un pulsante a cui ho dato il comando geturl linkato ad un file in locale. Ho due problemi: innanzitutto la pagina viene aperta sotto l’animazione e non me ne accorgo finche non la chiudo 2) con firefox mi apre una pagina bianca….? Hai qualche idea su come risolvere questo problema? Thanks
Scrivi il codice che usi per il getURL.
Ciao Cristian, il problema che ho d avanti è sempre quello descritto nel tuo blog, ma ovviamente non riesco a risolverlo inserendo quel codice….
Ciao Alex,
puoi scrivere il codice della chiamata che non funziona?
Grazie.
il codice è lo stesso che ho copiato da quello sopra, ovvero :
var swfUrl:String = _root._url;
var lastSlashIndex:Number = swfUrl.lastIndexOf(“/”);
var pipeIndex:Number = swfUrl.indexOf(“|”);
var baseUrl:String;
if (pipeIndex >= 0) {
baseUrl = swfUrl.substring(0, pipeIndex);
baseUrl += “:”;
} else {
baseUrl = “”;
}
baseUrl += swfUrl.substring(pipeIndex + 1, lastSlashIndex + 1);
cose_btn.onRelease = function(){
var targetUrl:String = baseUrl + “index.html”;
getURL(targetUrl, “_self”);
}
penso sia dovuto alla versione di firefox…
Con Firefox 3.5.6 su XP funziona.
Tu sei su Mac o PC?
Che versione di Flash Player o di Flash CS? hai installato?
Vengono visualizzati errori? Quali?
Ho un Mac con Flash player 10.0 ( Flash CS4 ambiente di sviluppo ) nessun errore visualizzato, il filmato swf viene esportato con as 2.0…