Funktionen registriert mit ExternalInterface.addCallback nicht in Javascript zur Verfügung stehen

Arbeite ich an einem Flash-Spiel, die Bedürfnisse zu nennen, einige Javascript auf der Seite und Holen Sie Daten zurück von ihm. Aufruf Javascript aus Flash funktioniert. Aufruf der Flash-Funktionen aus Javascript (oft) nicht.

Ich bin mit dem Gaia framework.

Was passiert:

  1. Die swf-Datei geladen wird mit SWFObject
  2. Es gibt eine Schaltfläche in der Flash-Datei. Auf klicken, verwendet es ExternalInterface.call() zum aufrufen einer Javascript-Funktion. Das funktioniert.
  3. Die Javascript-Funktion ruft eine Flash-Funktion, die ausgesetzt war, mit ExternalInterface.addCallback().
  4. Manchmal, der Javascript erzeugt die folgende Fehlermeldung: TypeError: myFlash.testCallback is not a function.
  5. Wenn der Fehler passiert, es betrifft alle Funktionen registriert mit addCallback(). Gaia und einige seiner mitgelieferten Bibliotheken nutzen addCallback(), und nannte die Funktionen von Javascript erzeugt auch die TypeError.
  6. Wartete eine lange Zeit, bevor Sie auf die Schaltfläche in Flash nicht behoben der Fehler.
  7. Mit Flash erneut versuchen addCallback() regelmäßig nicht behoben der Fehler
  8. Wenn die Fehlermeldung Auftritt, ExternalInterface.available = true und ExternalInterface.objectID enthält den richtigen Namen für das Flash-embed-Objekt.
  9. Wenn die Fehlermeldung Auftritt, document.getElementById('myflashcontent') richtig gibt das Flash-embed-Objekt.

Bearbeitet, um hinzufügen:

  • Dieses Problem zeigt sich in Firefox 3.6, nicht aber in Chrome oder IE8. Ich habe nicht versucht, ältere Browser.
  • Ich bin mit der Debug-version des Flash player.
  • Meine Anrufe zu ExternalInterface.addCallback() eingewickelt in einem try...catch block. Wenn der JS-Fehler Auftritt, wird die catch block ist nicht ausgelöst. Es ist eine Stille scheitern.
  • Der Fehler tritt auf, wenn Sie den Test auf einem webhost, mit der geladene swf-Datei vom gleichen server wie die Seite, die Sie ist.
  • Ich allowScriptAccess = always.
  • Einstellung flash.system.Security.allowDomain("mydomain") nicht den Fehler beheben.

Von meiner Seite Klasse:

public class MyPage extends AbstractPage
{
    //declarations of stage instances and class variables

    //other functions

    override public function transitionIn():void 
    {
        send_button.addEventListener(MouseEvent.MOUSE_UP, callJS);
        exposeCallbacks();

        super.transitionIn();
    }

    private function exposeCallbacks():void
    {
        trace("exposeCallbacks()");
        if (ExternalInterface.available) {
            trace("ExternalInterface.objectID: " + ExternalInterface.objectID);
            try {
                ExternalInterface.addCallback("testCallback", simpleTestCallback);
                trace("called ExternalInterface.addCallback");
            }
            catch (error:SecurityError) {
                trace("A SecurityError occurred: " + error.message + "\n");
            }
            catch (error:Error) {
                trace("An Error occurred: " + error.message + "\n");
            }
        }
        else {
            trace("exposeCallbacks() - ExternalInterface not available");
        }
    }

    private function simpleTestCallback(str:String):void
    {
        trace("simpleTestCallback(str=\"" + str + "\")");
    }

    private function callJS(e:Event):void
    {
        if (ExternalInterface.available) {
            ExternalInterface.call("sendTest", "name", "url");
        }
        else {
            trace("callJS() - ExternalInterface not available");
        }
    }

}

Meine Javascript:

function sendTest(text, url) {
    var myFlash = document.getElementById("myflashcontent");

    var callbackStatus = "";
    callbackStatus += '\nmyFlash[testCallback]: ' + myFlash['testCallback'];
    //console.log(callbackStatus);

    var errors = false;
    try {
        myFlash.testCallback("test string");
    }
    catch (err) {
        alert("Error: " + err.toString());
        error = true;
    }

    if (!error) {
        alert("Success");
    }
}

var params = {
    quality: "high",
    scale: "noscale",
    wmode: "transparent",
    allowscriptaccess: "always",
    bgcolor: "#000000"
};
var flashVars = {
    siteXML: "xml/site.xml"
};
var attributes = {
    id: "myflashcontent",
    name: "myflashcontent"
};

//load the flash movie.
swfobject.embedSWF("http://myurl.com/main.swf?v2", "myflashcontent",
"728", "676", "10.0.0", serverRoot + "expressInstall.swf",
flashVars, params, attributes, function(returnObj) {
    console.log('Returned ' + returnObj.success);
    if (returnObj.success) { returnObj.ref.focus(); }
});
  • Haben Sie jemals Abbildung dieser Fehler aus? Ich bin immer der gleiche, nur ich bin immer nur im IE, nicht FF oder Chrome. So seltsam
  • Das Problem scheint zu sein, nur mit Firefox und Flash im debug-Modus (nicht in Chrome) (nur unter Linux?).
InformationsquelleAutor Selene | 2010-04-14
Schreibe einen Kommentar