How to call dynamically created flash external interface in IE from javascript?
What I have:
Example of exporting functions in swf:
flash.external.ExternalInterface.addCallback("isActive", ...
Example of creating the embed object:
var b = document.createElement('embed');
b.type = 'applicationu002fx-shockwave-flash';
b.setAttribute('allowFullScreen', 'true');
b.setAttribute('allowNetworking', 'all');
b.setAttribute('allowScriptAccess', 'always');
b.width = 500;
b.height = 400;
b.src = 'assetsu002fUltra4.UltraApplicationu002fUltra4.UltraApplication+UltraSprite.swf';
Example of calling flash external interface in javascript:
try
{
e = b.isActive();
}
catch (__exc){ }
In IE it will catch with message "Object doesn't support this property or method"
How to fix it?
In script debugger I can see a third party script which is supposed to be the bridge:
function __flash__arrayToXML(obj) {
var s = "<array>";
for (var i=0; i<obj.length; i++) {
s += "<property id="" + i + "">" + __flash__toXML(obj[i]) + "</property>";
}
return s+"</array>";
}
function __flash__argumentsToXML(obj,index) {
var s = "<arguments>";
for (var i=index; i<obj.length; i++) {
s += __flash__toXML(obj[i]);
}
return s+"</arguments>";
}
function __flash__objectToXML(obj) {
var s = "<object>";
for (var prop in obj) {
s += "<property id="" + prop + "">" + __flash__toXML(obj[prop]) + "</property>";
}
return s+"</object>";
}
function __flash__escapeXML(s) {
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
}
function __flash__toXML(value) {
var type = typeof(value);
if (type == "string") {
return "<string>" + __flash__escapeXML(value) + "</string>";
} else if (type == "undefined") {
return "<undefined/>";
} else if (type == "number") {
return "<number>" + value + "</number>";
} else if (value == null) {
return "<null/>";
} else if (type == "boolean") {
return value ? "<true/>" : "<false/>";
} else if (value instanceof Date) {
return "<date>" + value.getTime() + "</date>";
} else if (value instanceof Array) {
return __flash__arrayToXML(value);
} else if (type == "object") {
return __flash__objectToXML(value);
} else {
return "<null/>"; //???
}
}
function __flash__addCallback(instance, name) {
instance[name] = function () {
return eval(instance.CallFunction("<invoke name=""+name+"" returntype="javascript">" + __flash__argumentsToXML(arguments,0) + "</invoke>"));
}
}
function __flash__removeCallback(instance, name) {
instance[name] = null;
}
I'm not sure if I understand your question correctly. But I think you are missing a couple of things:
1) Your embed tag needs a name attribute. Let's name it "NewFlashMovie" for the subsequent code:
b.name = "NewFlashMovie";
2) You need to call the "isActive" function differently using an external function. First add this function
function thisMovie(movieName) {
if (navigator.appName.indexOf("Microsoft") != -1) {
return window[movieName];
} else {
return document[movieName];
}
}
Then you can call the function like this
thisMovie("NewFlashMovie").isActive();
From my experience, this "thisMovie" is essential to bridge the IE-Flash calls. This is also documented in the ExternalInterface documentation
3) I also recommend using swfobject instead of creating your own "embed" object.
Hope these helps.
I've found that, for IE, calling Javascript from ActionScript, I've needed to supply an "id" attribute to the object tag. The IE way of handling ExternalInterface.call(...) is to call a method on the object . IE issues the code
document.getElementById("...").SetReturnValue(...)
Without an id attribute on your object tag, this reduces to
document.getElementById("").SetReturnValue(...)
which tries to call SetReturnValue on a null object.
Note that the "id" attribute isn't required for other browsers but doesn't really hurt either.
Something similar may be happening in your case: Perhaps a "name" attribute on the embed may help.
Could this be to do with the fact your creating an Embed tag instead of an Object tag? IE traditionally uses Object tags to embed Flash content
See the Adobe tech not for discussion: http://kb2.adobe.com/cps/415/tn_4150.html
链接地址: http://www.djcxy.com/p/44360.html上一篇: BufferedIterator实现