Functions registered with ExternalInterface.addCallback not available in Javascript
Posted
by Selene
on Stack Overflow
See other posts from Stack Overflow
or by Selene
Published on 2010-04-14T00:18:24Z
Indexed on
2010/04/14
0:23 UTC
Read the original article
Hit count: 697
I'm working on a Flash game that needs to call some Javascript on the page and get data back from it. Calling Javascript from Flash works. Calling the Flash functions from Javascript (often) doesn't.
I'm using the Gaia framework.
What happens:
- The swf is loaded in with SWFObject
- There's a button in the Flash file. On click, it uses
ExternalInterface.call()
to call a Javascript function. This works. - The Javascript function calls a Flash function that was exposed with
ExternalInterface.addCallback()
. - Sometimes, the Javascript produces the following error:
TypeError: myFlash.testCallback is not a function
. - When the error happens, it affects all functions registered with
addCallback()
. Gaia and some of its included libraries useaddCallback()
, and calling those functions from Javascript also produces the TypeError. - Waiting a long time before pressing the button in Flash doesn't solve the error.
- Having Flash re-try
addCallback()
periodically doesn't solve the error - When the error occurs,
ExternalInterface.available = true
andExternalInterface.objectID
contains the correct name for the Flash embed object. - When the error occurs,
document.getElementById('myflashcontent')
correctly returns the Flash embed object.
From my Page class:
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");
}
}
}
My 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(); }
});
© Stack Overflow or respective owner