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:
- Die swf-Datei geladen wird mit SWFObject
- Es gibt eine Schaltfläche in der Flash-Datei. Auf klicken, verwendet es
ExternalInterface.call()
zum aufrufen einer Javascript-Funktion. Das funktioniert. - Die Javascript-Funktion ruft eine Flash-Funktion, die ausgesetzt war, mit
ExternalInterface.addCallback()
. - Manchmal, der Javascript erzeugt die folgende Fehlermeldung:
TypeError: myFlash.testCallback is not a function
. - Wenn der Fehler passiert, es betrifft alle Funktionen registriert mit
addCallback()
. Gaia und einige seiner mitgelieferten Bibliotheken nutzenaddCallback()
, und nannte die Funktionen von Javascript erzeugt auch die TypeError. - Wartete eine lange Zeit, bevor Sie auf die Schaltfläche in Flash nicht behoben der Fehler.
- Mit Flash erneut versuchen
addCallback()
regelmäßig nicht behoben der Fehler - Wenn die Fehlermeldung Auftritt,
ExternalInterface.available = true
undExternalInterface.objectID
enthält den richtigen Namen für das Flash-embed-Objekt. - 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 einemtry...catch
block. Wenn der JS-Fehler Auftritt, wird diecatch
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?).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Anrufe an JS über ExternalInterface-eingewickelt in eine
try { }
block und das bewirkt, dass nachfolgende JS-Fehler zu bekommen, unterdrückt.Einen workaround für die gleiche ist die Ursache eine Funktion, closure in JavaScript und führen Sie den eigentlichen code, nach einem timeout.
Beispiel:
Hier war unser Szenario, sobald wir eingegrenzt werden alle Bedingungen erfüllt:
In diesem speziellen Szenario, ExternalInterface.call() würde nicht Feuer sofort. Es funktioniert nur nach dem erstellen einer winzigen Verzögerung mit Timer-Klasse.
Wenn wir wmode=window oder entfernt, die alert() - alles funktioniert. Versuchen Sie es mit der Konsole.log() zur Anzeige von debug-text in firebug.
Der andere Punkt? Ob deine js-Funktion gibt ein array oder ein Objekt gegen einen string. Überraschend die Rückkehr der native js-array interpretiert wurde, indem ein array in Flash. Versuchen Sie, die Ausgabe von info über Ihre Daten zurückgeben wie dieser:
Diese könnte ähnlich wie das Problem bei Ihnen Auftritt.
http://www.google.com/support/forum/p/translator-toolkit-api/thread?tid=58cda1b34ae1e944&hl=de
Können Sie sehen, dass Art von Fehlermeldung, wenn etwas falsch passiert in Flash, während Sie telefonieren. So etwas wie eine nicht abgefangene Ausnahme.
Sind Sie mit der debug-version des players? Das könnte Ihnen mehr Informationen geben über das, was Los ist.
Außerdem ist dies konsistent in allen Browsern? Ich habe gesehen, alte Versionen des IE Probleme mit der Annahme bei mehreren aufeinanderfolgenden Flash <-> JS aufruft.
J
Ich tryied code und Es funktionierte ok, wenn ich ein alert vor allem, so, ich thinkg es ist etwas, das im Zusammenhang mit irgendeiner Art von Zeit, die Sie warten müssen.
Haben Sie versucht, diese in JavaScript?
Ich hatte diese in vielen Fällen.
Wieder an bestimmte Orte, die ich hatte, neu zu definieren, __flash_addCallback und _flash_removeCallback Funktionen zur Minimierung der Fehler.
Derzeit weiß ich nicht, was ich Tat, für die __flash_addCallback, aber das ist, was ich für letzteres:
Haben wir laufen in das gleiche problem, und nur in Firefox.
Folgenden die Ratschläge von THM waren wir in der Lage, eine Lösung zu finden.
In unserem Fall die swf eingefügt wurde innerhalb eines div-animiert in die Ansicht mit jQuery.slideDown(). Diese offenbar bewirkt, dass es manchmal neu starten, während gestartet wird. In einigen Fällen führte dies zu der callback-Funktionen nicht zur Verfügung stehen.
Behoben, durch Aufruf von swfobject.embedSWF nur nach der slideDown-Effekt beendet hatte.
Ich wurde immer diese Fehlermeldung, denn ich hatte die gleiche Flash Datei auf der Seite mehrmals. Obwohl jeder von Ihnen hatte eine andere id/name, Sie waren alle mit der gleichen callback.