Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.
Toon posts:

[AS3] krijg ExternalInterface niet aan de praat

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een probleem met een flash experiment waarmee ik bezig ben: het flashdocument is simpelweg een aardig geanimeerde klok: naar deze klok kunnen echter ook boodschappen (als string) verstuurd worden die dan weergegeven worden ipv de tijd. Deze klok is een volledig aparte klasse die perfect werkt.
Het probleem is dat ik deze klok extern met javascript wil aansturen. Volgens de flash documentatie is zoiets zeer eenvoudig klaar te spelen. In mijn hoofdklasse kwam dan ook deze actionscript code te staan:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Main extends Sprite {
        
        private var movie:TextMessage; //TextMessage is de naam van de klasse die aan de geanimeerde klok gelinkt is
        
        public function Main():void {
            
            movie = main_movie; //main_movie is de id van de klok instance op de stage
            
            if (ExternalInterface.available) {
                movie.changeText("external interface ready"); //deze wordt bij het uitvoeren wél weergegeven: de klasse en bijhorende changeText functie werken dus perfect, alsook ExternalInterface is dus beschikbaar.
                ExternalInterface.addCallback("sendToActionScript", receivedFromJavaScript); //het relevante stukje code dat voor interactie met javascript zou moeten zorgen
            };
        }
        
        private function receivedFromJavaScript(value:String):void{
            movie.changeText(value);
        }
}


Op mijn webpagina kwam dan het volgende stukje javascript terecht:
JavaScript:
1
2
3
4
function updateFlashText(){
        var content = document.getElementById("text_content").value;
        getFlashMovie("clock").sendToActionScript(content);
}

Deze javascript wordt door een "submit" knop opgeroepen. Heb de variabelen die hij krijgt gechecked via window.alert, en deze zijn correct. "clock" is de id van het flash object op de webpagina.

Het probleem: dit werkt niet -O-. Heb daarna een aantal zaken geverifiëerd:
- de embedding variabele van flash: 'allowScriptAccess' staat ingesteld op 'always', hoewel hij standaard op 'sameDomain' stond, wat ook zou moeten werken.
- security settings van flash player nagekeken, maar hier vind ik niets relevants.

Wat zie ik nu eigenlijk over het hoofd? Volgens verscheidene sites zou dit juist zeer eenvoudig moeten zijn :|

Verwijderd

Topicstarter
subtiele kick :)

  • Cousin Boneless
  • Registratie: Juni 2008
  • Laatst online: 28-02 12:55
Toevallig ook eens mee aan het hannesen geweest. In mijn flash movie heb ik het volgende script op het eerste frame van de movie:

Flash ActionScript:
1
2
3
4
5
function Select(index:int)
{
// do someting with this value
}
ExternalInterface.addCallback("Select", Select);


En met javascript roep ik dat aan:
JavaScript:
1
2
            if (movieReady)
                movie.Select(anInteger);


Dus ik denk dat je je 'sendToActionScript' functie even met addCallback moet aanmelden als externe callback.. of is dat een predefined iets? Gebruik overigens Flash CS3. Verbazingwekkend hoe makkelijk dit tegenwoordig gaat..

Edit: Okee, ik zie 'm al staan. Ik heb geen idee of je een (private) memberfunctie daarvoor kan gebruiken. Ik heb 'm gewoon als losse functie in het eerste frame.

[ Voor 11% gewijzigd door Cousin Boneless op 26-08-2008 23:02 ]


Verwijderd

Topicstarter
de enige private functie is die receivedFromJavaScript, die krijgt zijn gegevens door van de publieke Main functie, waarin de code staat om de Externalinterface op te bouwen en te luisteren. Ik dacht dat er eventueel nog een EventListener zou nodigzijn, maar dat is niet het geval blijkbaar.

  • Cousin Boneless
  • Registratie: Juni 2008
  • Laatst online: 28-02 12:55
Ik ben eigenlijk een behoorlijke noob op het gebied van AS3, dus misschien sla ik de plank volkomen mis, maar.. je maakt een class Main die je erft van Sprite. Volgens mij is dat zoiets als een MovieClip die je vervolgens zelf nog in je timeline van de movie moet hangen. (ik zie nergens de code waar deze Main wordt geinstantieerd.) Volgens mij heb je in de timeline van de movie nu zoiets als:
code:
1
var mainInstance : Main = new Main();

En daar kan je dan een losse functie onder zetten die je als proxy tussen je timeline en je instantie van Main gebruikt:
code:
1
2
3
4
5
function receivedFromJavaScript(value: String)
{
  mainInstance.receivedFromJavaScript(value);
}
ExternalInterface.addCallback("sendToActionScript", receivedFromJavaScript);

Uiteraard kan je de scope van Main.receivedFromJavaScript dan niet private houden.
Misschien praat ik volledig poep, maar aangezien er verder niemand reageert doe ik maar een poging.

Verwijderd

Topicstarter
Deze klasse is verbonden aan de main stage zelf (daar dient dat "Document class" invoerveld voor ;)) en wordt dus aangeroepen zodra de flash geladen wordt en alles wat in de constructor staat wordt direct uitgevoerd. Die moet dus niet meer geïnstantiëerd worden omdat er al direct een instance van beschikbaar is.

Zoals ik eerder zei: de hele code werkt (de tekst verandert bijvoorbeeld wel naar "external interface ready"), enkel het ExternalInterface gedeelte loopt fout.

  • Cousin Boneless
  • Registratie: Juni 2008
  • Laatst online: 28-02 12:55
Zelf eens even geprobeerd.. op http://www.4nothing.net/a...al/ExternalInterface.html staat een example dat wel erg op jouw situatie lijkt.

Volgende stappen doorlopen:
- Nieuwe movie aangemaakt met de naam ExternalInterfaceExample.fla
- In dezelfde directory dit voorbeeld gekopieerd naar ExternalInterfaceExample.as
- De html source uit het voorbeeld gekopieeerd naar ExternalInterfaceExample.html
- De as file gelinkt in de movie met 'Document Class' (leermomentje voor mij :))
- De movie getest (menu Control|test movie)

Tot zover alles okee. Echter als ik dit voorbeeld vanuit de html opstart krijg ik van FireFox een security error om m'n oren (A SecurityError occurred: Error #2060) en IE7 geeft een error (Object does not support this property or method).

- Uploaden naar website

Vanaf de website doet FireFox het wel maar geeft IE7 nog steeds een error.

- Aanpassen van de html pagina

Als je vanuit Flash de movie publiceert met html, zie je dat de movie heel anders in de html geschreven wordt dan in het voorbeeld. Namelijk met AC_FL_RunContent. Vervang je nu alles van <object> t/m </object> door deze gegenereerde AC_FL_RunContent constructie (inclusief .js include file in de head) dan vindt IE7 het opeens ook leuk.

Hopelijk heb je er wat aan.
Pagina: 1