Aufrufen einer Flex/AS3 Rückruf von Javascript
Ich habe eine Javascript-API, die sollte verwendbar sein, die mit GWT und Flex. Mit der FABridge es ist wirklich einfach zu nennen Javascript-Methoden aus AS3 und Umgekehrt. Aber wenn ich versuche, registrieren Sie einen Rückruf zu einer AS3-Methode in meinem Javascript-API stecken ich. Hier ist eine kurze code-Beispiel:
public function initApp():void {
if (ExternalInterface.available) {
ExternalInterface.addCallback("foobar", foobar);
}
}
public function foobar():void {
//the callback function
Alert.show("Callback from API works!");
}
private function btnCallbackClicked():void {
ExternalInterface.call("testAPICallbackFromJS", Application.application.foobar);
}
Und die einfache JS-Methode:
function testAPICallbackFromGWT(callback){
$clinit_26(); //added by the GWT compiler
alert('callback to be launched 3 2 1');
callback();
}
Aber diese version funktioniert nicht, da erhalte ich immer eine leere Funktion in meinem JS-code. Es scheint, dass die FABridge ist, schneiden Sie den rest.
Dann habe ich versucht einen anderen Ansatz. Ich schrieb einen kleinen JS-Methode, die den Namen der Funktion und erstellt den Rückruf von der JS-Seite.
registerFlexCallback = function(registerMethod, callback, id) {
/*
workaround to create a callback for an AS method, which can be called by Javascript
* registerMethod - Javascript method which shall be called for registration with the created callback as parameter
* callback - AS method that shall be called by Javascript (available over the FABridge interface)
* id - ID of the flash object (use Application.application.id in AS)
*/
var swf = document.getElementById(id);
eval(registerMethod + "(swf." + callback + ");");
};
Dieser arbeitet gut mit dem Internet Explorer, aber mit keinem anderen browser. Zum Beispiel in Firefox bekomme ich die folgende Fehlermeldung:
NPMethod called on non-NPObject wrapped JSObject!
Kann jemand mir sagen, was dieser Fehler (vielleicht eine Art von Sicherheits-Problem)? Oder hat jemand eine bessere Idee, wie das zu schaffen Rückrufe für meine AS3 Methoden, die aufgerufen werden können, von JS?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist, weil die Funktionen nicht serialisieren über die FABridge. Sinn in Ihrem
der zweite parameter immer null. Was ich Tue, ist, eine wrapper-Methode, die auf der HTML-Seite per eval die Punkte an meinem einbetten und damit die callback Hinzugefügt. So haben Sie ein zusätzliches, während der lästige Schritt:
Den NPObject Fehler, die Sie sehen, ich bin mir ziemlich sicher, ist ein Sicherheits-Fehler ( je nachdem, wo es herkommt, in den FF-code ) wahrscheinlich verhindern, dass Sie dynamisch Einspritzen von Methoden, die eval ' ed, ohne mit dem JS-interpreter in die Quere.
Ich habe gar nicht versucht zu kompilieren, die oben so, ich hoffe, Sie bekommen das wesentliche.
Merke ich zwei Dinge gleich,
zunächst erscheint Ihre ExternalInterface wird sterben, wenn Sie die ExternalInterface ist nicht bereit.
Ich würde noch ein Timeout und versucht dann wieder so, dass er versucht wieder, bis Externalinterface bereit ist.
Auch sehe ich nicht die Funktion "foobar" in deinem javascript-code. Ich sehe callback übergeben als variable, aber ohne varifying, dass es in der Tat 'foobar' dies ist die Art von Sache, die kann das testen eine misserable Veranstaltung.
Ich würde vereinfachen Sie Ihre Tests so, dass es weniger bewegliche Teile.
wenn das funktioniert
Diese Weise können Sie in den Griff bekommen, und dies bit für bit, was funktioniert und wo es bricht.
Bezahlen atention, um das timing, wenn Sie können tigger Ihre flash-Taste, Aktionen und Ihre javascript-links können Sie illiminate eine Reihe von be-Fragen. natürlich müssen Sie lösen eine autoload-version für Ihr starten, aber zum testen manuell ausgelöste Ereignisse können Dinge vereinfachen sich erheblich.
aber auch, weil es javascript den browser relevant ist.
Ich habe gesehen, konsistente Ergebnisse in Firefox und Internet explorer, die brechen in safari und manchmal IE die ungeraden browser aus.
Manchmal Firefox ist der einzige, der bricht.
den Sie gerade haben, alle auszuprobieren.