La cosa mi sembra interessante così ho fatto qualche prova per capire quale fosse il problema e come poterlo risolvere.
Premetto che ho fatto dei test in maniera empirica giungendo a diverse possibili soluzioni ma potrebbero esserci altre soluzioni più mirate per questo tipo di problema (anche se cercando non ho trovato nulla in merito).
Partiamo dal fatto che il problema si presenta (da quanto sembra) solo su firefox facendo girare i filmati della pagina html in locale.
Sul filmato "di invio", oltre lo script iniziale, ho inserito un evento all'oggetto LocalConnection in modo che mi fosse restituito lo STATUS della connessione per capire cos'è che andava storto.
Una cosa tipo:
codice:
conn.addEventListener(StatusEvent.STATUS, onStatusEvent);
function onStatusEvent(e:StatusEvent):void {
alert.text=e;
}
Nella mia casella "alert", quando la connessione va a buon fine, viene stampato il seguente messaggio:
codice:
[StatusEvent type="status" bubbles=false cancelable=false eventPhase=2 code=null level="status"]
...dove level="status" (che ho evidenziato) indica che la connessione è andata a buon fine, mentre quando il coso non funziona si può notare il valore di errore per la proprietà level:
codice:
[StatusEvent type="status" bubbles=false cancelable=false eventPhase=2 code=null level="error"]
Questo errore viene dato normalmente se la connessione non è avvenuta per un qualsiasi motivo o se in qualche modo quella stessa connessione è stata persa e non viene più riconosciuta.
Venendo al dunque, quando su firefox (in locale) si fa "aggiorna pagina", è come se la vecchia connessione resti ancora aperta per qualche decimo di secondo nel momento in cui viene comunque aggiornato il contenuto della pagina, creando così una sorta di tilt per la nuova connessione che si sta cercando di stabilire, perché questa avrà comunque lo stesso nome di connessione.
Non ho idea del perché firefox si comporti così in locale ma presumo che dipenda dalla gestione delle sessioni e dei vari eventi di tale browser. Il problema non si presenta online perché probabilmente ci sono di mezzo i tempi di trasmissione dati che, presumo, danno modo di chiudere correttamente la connessione pre-esistente per riaprire poi la nuova senza creare conflitti.
Ho trovato al momento 3 diverse soluzioni.
1- agire da javascript aggiungendo un timer nel codice di embed dei filmati in modo da attendere in qualche modo la chiusura della connessione prima che siano aggiornati i filmati sulla pagina.
Ad esempio se si usa swfobject si avrà una cosa tipo:
Codice PHP:
<script type="text/javascript">
setTimeout(function(){
swfobject.embedSWF("filmatoSend.swf","swf1","550","400","9.0.0");
swfobject.embedSWF("filmatoListen.swf","swf2","200","100","9.0.0");
},100)
</script>
Ovviamente il tempo di 100 millisecondi farà vedere un vuoto, seppure per un attimo, al caricamento della pagina.
2- da AS forzare la chiusura della connessione una volta fatto il suo dovere.
Ad esempio, considerando il tuo script nel filmato in ascolto:
Codice PHP:
var conn:LocalConnection = new LocalConnection();
conn.connect("cambiatitolo");
conn.client=this;
function titoloHome():void {
titolo_txt.text="Home Page";
conn.close();
}
Da tenere conto che però la connessione resterà chiusa una volta eseguita l'azione di scrittura del testo. In questo caso è sicuramente un problema perché la connessione serve comunque aperta per gli altri eventuali pulsanti che la richiamano.
Ho provato a inserire il close all'interno di un evento UNLOAD, in modo da chiudere la connessione solo quando venisse chiuso anche il filmato, ma non ho avuto esito positivo.
3- A mio parere la soluzione migliore è quella di assegnare un nuovo nome ogni volta che si va a riaprire una nuova connessione in modo che sia scongiurato qualsiasi conflitto di eventuali connessioni rimaste aperte. Questo può essere fatto passando un valore univoco da javascript ai due swf (ad es. con getTime), come una sorta di chiave di connessione tra i filmati stessi, e riutilizzare, all'interno dei filmati, quel valore per comporre il nome della connessione.
Quindi si avrà uno script JS del tipo:
Codice PHP:
<script type="text/javascript">
var id=new Date().getTime();
swfobject.embedSWF("filmato1.swf?id=" + id,"swf1","400","800","9.0.0");
swfobject.embedSWF("filmato2.swf?id=" + id,"swf2","200","100","9.0.0");
</script>
Mentre nei filmati (ovviamente in entrambi) si andrà a comporre il nome con uno script tipo:
Codice PHP:
var id = this.loaderInfo.parameters.id;
var conn:LocalConnection = new LocalConnection();
//...
conn.send("cambiatitolo"+id,"titoloHome");
Questa soluzione, per via della necessità di assegnare uno stesso nome di connessione, potrebbe presentare problemi qualora si debba creare la connessione tra filmati che non siano richiamati contemporaneamente e all'interno della stessa pagina (non è questo il caso).
In conclusione, spero possa comunque tornare utile anche se il problema ad ogni modo sembra non esserci se il tutto è messo online.