[AS3 / JScript] AS3 functie aanroepen met JScript geeft fout

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Walance
  • Registratie: September 2005
  • Laatst online: 11-09 15:12

Walance

Hm.. wat zal ik hier schrijven

Topicstarter
Ik heb in ActionScript 3 iets gemaakt (dit is de eerste keer dat ik iets doe met flash en ActionScript).
Daarin zitten functies die ik vanuit Javascript wil aanroepen. Deze heb ik zo gemaakt:
Flash ActionScript:
1
2
3
4
5
6
ExternalInterface.addCallback("functieNaam", functieNaam);

function functieNaam():void
{
    // Doe iets
}


Mijn swf zet ik op de pagina m.b.v. jQuery.media en SWFObject met de volgende code:
HTML:
1
<div id="flash" href="flashbestand.swf?<%=DateTime.Now.Ticks%>"></div>


De <%=DateTime.Now.Ticks%> is van ASP.NET, daarmee zorg ik dat de swf niet uit de cache geladen wordt. Dit leg ik verderop uit.

Vervolgens gebruik ik dit om het flash object te maken/laden:
JavaScript:
1
$('#flash').media({ width: '100%', height: '100%', autoplay: true });


En ten slotte gebruik ik deze code om de ActionScript functie(s) aan te roepen:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
// Chrome and IE use children[0], but Firefox uses flashObject[0].
var flashObject = $("#flash");
var children = flashObject.children();
if (children && children.length > 0 && children[0].functieNaam)
{
    children[0].functieNaam();
}
else if (flashObject.length > 0 && flashObject[0].functieNaam)
{
    flashObject[0].functieNaam();
}


Deze code werkt perfect in Firefox en Chrome. Het werkt niet goed in Internet Explorer. Ik heb dit allemaal op verschillende machine's getest. In Internet Explorer krijg ik steeds de volgende foutmelding:
code:
1
2
Line: 49
Error: Unspecified error.


Als ik dat vervolgens ga debuggen, zie ik dat de foutmelding voorkomt in het volgende stukje:
JavaScript:
1
2
3
4
5
function __flash__addCallback(instance, name) {
  instance[name] = function () { 
    return eval(instance.CallFunction("<invoke name=\""+name+"\" returntype=\"javascript\">" + __flash__argumentsToXML(arguments,0) + "</invoke>"));
  }
}

Deze code is niet door mij gemaakt. Na wat zoeken blijkt dat deze code toegevoegd wordt door flash zelf, om ActionScript aanroepen vanuit Javascript mogelijk te maken.

Toen ik weer op een andere pc ging testen, merkte ik dat mijn code opeens wel werkte. Echter, na een verversing van de pagina, werkte het opeens niet meer en kreeg weer ik dezelfde foutmelding als op de andere pc. Toen bedacht ik me dat het misschien iets met caching te maken heeft. Dat is dus de reden dat ik die timestamp had toegevoegd aan de src. Dit loste het probleem op voor die machine. Ik kon zoveel verversen als ik wilde, het bleef voortaan goed werken. Deze pc heeft Windows 7 met IE9.

Ik dacht dus dat het toen opgelost was, maar voor de zekerheid ging ik het op nog een andere pc testen met Windows Vista en IE8. Daar was het probleem nog steeds niet opgelost. Daarna ging ik ook weer op mijn ontwikkel-pc testen (ook met Windows 7 en IE9) en daarop kwam ook nog steeds het probleem voor.

Ik ben hier al bijna de hele week mee bezig en ik kom er maar niet uit. Ik heb verschillende dingen geprobeerd van wat ik had gevonden tijdens mijn zoektocht (zoals de jqeury.media functie pas later of juist eerder aanroepen, het resultaat van jquery.media (= het nieuwe flashobject) in een window variable zetten, en nog andere rare dingen die ik al niet meer weet).

Iemand die hier ervaringen mee heeft en mij kan helpen? Ik kom er echt niet meer uit, zeker omdat het probleem dus op één pc wel is opgelost en op anderen niet.

// Edit: Wat ik nog was vergeten te zeggen is dat ik ook heb geprobeerd om mijn swf te debuggen met remote debugging en de debug flash player, maar als ik een breakpoint zet in de functie die door Javascript wordt aangeroepen, dan komt de debugger daar nooit in.

[ Voor 3% gewijzigd door Walance op 06-04-2012 12:52 ]


Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
External interface is niet meteen beschikbaar wanneer een SWF ingeladen is. Voeg eerst je callback functies toe en configureeer de hele external interface functies die je nodig hebt. Roep dan vanuit AS een JS functie aan om door te geven dat de SWF 'klaar is' om externe commando's te ontvangen. Pas wanneer je dit signaal ontvangen hebt is het enigzins veilig1 om met je SWF te communiceren.


1) Enigzins, want eigenlijk is het nooit veilig. Firefox en Chrome browsers kunnen tijdens een zgn. reframing operatie je hele SWF resetten, waardoor er weer een korte tijd is waarbinnen de externe interface nog niet beschikbaar is en een aanroep weer tot een exception zal leiden...

Acties:
  • 0 Henk 'm!

  • Walance
  • Registratie: September 2005
  • Laatst online: 11-09 15:12

Walance

Hm.. wat zal ik hier schrijven

Topicstarter
Hmm oke, bedankt voor je antwoord, dat wist ik niet. Echter is dit denk ik niet de oorzaak van mijn probleem want de AS functies die ik aanroep, worden pas aangeroepen wanneer de gebruiker op een bepaalde knop op de pagina klikt. Tegen de tijd dat alles geladen is en de gebruiker ook daadwerkelijk kan klikken op de knop, is de external interface al wel beschikbaar lijkt me?

Daarnaast krijg ik de foutmelding ook nog steeds wanneer ik de pagina een uur open heb laten staan en dan pas op de knop klik.

Acties:
  • 0 Henk 'm!

  • Walance
  • Registratie: September 2005
  • Laatst online: 11-09 15:12

Walance

Hm.. wat zal ik hier schrijven

Topicstarter
Nog een toevoeging. Het probleem treedt niet altijd op. Als ik de pagina steeds ververs en op de knoppen klik, dan werkt het soms wel en soms niet.