Mit ExternalInterface.addCallback registrierte Funktionen sind in Javascript nicht verfügbar

9

Ich arbeite an einem Flash-Spiel, das ein wenig Javascript auf der Seite aufrufen und Daten von ihm abrufen muss. Javascript aus Flash aufrufen funktioniert. Aufruf der Flash-Funktionen aus Javascript (oft) nicht.

Ich verwende das Gaia-Framework .

Was passiert:

  1. Das swf wird mit SWFObject
  2. geladen
  3. In der Flash-Datei befindet sich eine Schaltfläche. Beim Klicken verwendet es ExternalInterface.call() , um eine Javascript-Funktion aufzurufen. Das funktioniert.
  4. Die Javascript-Funktion ruft eine Flash-Funktion auf, die mit ExternalInterface.addCallback() .
  5. angezeigt wurde
  6. Manchmal erzeugt das Javascript den folgenden Fehler: TypeError: myFlash.testCallback is not a function .
  7. Wenn der Fehler auftritt, betrifft dies alle Funktionen, die mit addCallback() registriert wurden. Gaia und einige seiner enthaltenen Bibliotheken verwenden addCallback() , und das Aufrufen dieser Funktionen aus Javascript erzeugt auch den TypeError.
  8. Wenn Sie lange warten, bevor Sie die Taste in Flash drücken, wird der Fehler nicht behoben.
  9. Flash erneut versuchen addCallback() löst den Fehler nicht regelmäßig
  10. Wenn der Fehler auftritt, enthält ExternalInterface.available = true und ExternalInterface.objectID den korrekten Namen für das Flash-Einbettungsobjekt.
  11. Wenn der Fehler auftritt, gibt document.getElementById('myflashcontent') das Flash-Einbettungsobjekt korrekt zurück.

Bearbeitet zum Hinzufügen:

  • Dieses Problem tritt in Firefox 3.6 auf, aber nicht in Chrome oder IE8. Ich habe ältere Browser nicht ausprobiert.
  • Ich verwende die Debug-Version des Flash-Players.
  • Meine Aufrufe von ExternalInterface.addCallback() sind in einen Block try...catch eingeschlossen. Wenn der JS-Fehler auftritt, wird der catch -Block nicht ausgelöst. Es ist ein stiller Fehler.
  • Der Fehler tritt beim Testen auf einem Webhost auf, wenn das swf vom selben Server geladen wird wie die Seite, auf der es sich befindet.
  • Ich habe allowScriptAccess = always .
  • gesetzt
  • Die Einstellung flash.system.Security.allowDomain("mydomain") behebt den Fehler nicht.

Aus meiner Seitenklasse:

%Vor%

Mein Javascript:

%Vor%     
Selene 14.04.2010, 00:18
quelle

8 Antworten

2

Aufrufe, die über ExternalInterface an JS gesendet werden, sind in einen try { } -Block eingeschlossen, was dazu führt, dass nachfolgende JS-Fehler unterdrückt werden.

Eine Umgehung für dasselbe ist, eine Funktion in JavaScript zu schließen und den tatsächlichen Code nach einer Zeitüberschreitung auszuführen.

Beispiel:

%Vor%     
Shamasis Bhattacharya 22.06.2010 15:30
quelle
1

Hier war unser Szenario, nachdem wir alle Bedingungen eingegrenzt hatten:

  • Nur bei FireFox / Windows
  • Nur wenn wmode = transparent
  • Nur bei Verwendung der Funktion js alert ()

In diesem speziellen Szenario würde ExternalInterface.call () nicht sofort ausgelöst. Es funktionierte nur nach dem Erstellen einer winzigen Verzögerung mit Timer-Klasse.

Wenn wir wmode = window gemacht oder die alert () entfernt haben - alles hat funktioniert. Verwenden Sie console.log (), um Debug-Text in Firebug anzuzeigen.

Der andere Gotcha? Ob Ihre js-Funktion ein Array oder ein Objekt im Vergleich zu einer Zeichenfolge zurückgibt. Überraschenderweise wurde das native js-Array von einem Array in Flash interpretiert. Versuchen Sie, Informationen zu Ihren Rückgabedaten wie folgt auszugeben:

%Vor%     
Quinn Merio 27.01.2011 17:27
quelle
1

Dies könnte dem Problem ähneln, das Sie gerade erleben.

Ссылка

    
THM 14.06.2011 22:24
quelle
0

Sie können diese Art von Fehlermeldung sehen, wenn in Flash während des Anrufs ein Fehler aufgetreten ist. So etwas wie eine nicht abgefangene Ausnahme.

Laufen Sie die Debug-Version des Players? Das könnte dir mehr Informationen darüber geben, was vor sich geht.

Ist das auch konsistent für alle Browser? Ich habe alte Versionen von IE gesehen, die Probleme beim Akzeptieren mehrerer aufeinanderfolgender Flash & lt; - & gt; JS ruft an.

J

    
Juan Delgado 14.04.2010 06:30
quelle
0

Ich habe deinen Code getestet, und es hat funktioniert, wenn ich einen Alarm vor alles gestellt habe, also denke ich, dass es etwas mit einer Art von Zeit zu tun hat, die du warten musst.

    
Artemix 29.06.2010 21:06
quelle
0

Haben Sie das in JavaScript versucht?

%Vor%

Ich hatte das in vielen Fällen benutzt.

Wieder musste ich an bestimmten Stellen die Funktionen __flash_addCallback und _ flash _removeCallback neu definieren, um die Fehler zu minimieren.

Zur Zeit kann ich mich nicht erinnern, was ich für __flash_addCallback gemacht habe, aber das habe ich für letzteres getan:

%Vor%     
sudipto 04.06.2011 14:15
quelle
0

Wir sind auf dasselbe Problem gestoßen, und nur in Firefox.

Nach dem Rat von THM konnten wir eine Lösung finden.

In unserem Fall befand sich die swf, die eingefügt wurde, in einem div, das mit jQuery.slideDown () in die Ansicht animiert wurde. Dies führt dazu, dass es beim Starten manchmal neu gestartet wird. In einigen Fällen führte dies dazu, dass die Callback-Funktionen nicht verfügbar waren.

Wurde behoben, indem swfobject.embedSWF erst aufgerufen wurde, nachdem der slideDown-Effekt beendet wurde.

    
mtkopone 01.09.2011 12:58
quelle
0

Ich habe diesen Fehler erhalten, weil ich dieselbe Flash-Datei mehrmals auf der Seite hatte. Obwohl jede von ihnen eine andere ID / einen anderen Namen hatte, verwendeten sie alle denselben Callback.

    
Ron Rebennack 14.05.2012 02:08
quelle