如何在JavaScript中调用动态创建的Flash外部接口?
我拥有的:
在swf中导出函数的示例:
flash.external.ExternalInterface.addCallback("isActive", ...
创建嵌入对象的示例:
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';
在javascript中调用flash外部接口的示例:
try
{
e = b.isActive();
}
catch (__exc){ }
在IE中它会捕获消息“对象不支持这个属性或方法”
如何解决它?
在脚本调试器中,我可以看到应该是桥梁的第三方脚本:
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;
}
我不确定我是否正确理解你的问题。 但我认为你错过了几件事情:
1)您的嵌入式标签需要一个名称属性。 让我们将其命名为“NewFlashMovie”以获得后续代码:
b.name = "NewFlashMovie";
2)您需要使用外部功能以不同的方式调用“isActive”功能。 首先添加此功能
function thisMovie(movieName) {
if (navigator.appName.indexOf("Microsoft") != -1) {
return window[movieName];
} else {
return document[movieName];
}
}
然后你可以像这样调用函数
thisMovie("NewFlashMovie").isActive();
根据我的经验,这个“thisMovie”对于弥合IE-Flash通话至关重要。 这也记录在ExternalInterface文档中
3)我也推荐使用swfobject而不是创建自己的“嵌入”对象。
希望这些帮助。
我发现,对于IE,从ActionScript调用Javascript,我需要为object标签提供一个“id”属性。 处理ExternalInterface.call(...)的IE方式是调用对象的方法。 IE发布代码
document.getElementById("...").SetReturnValue(...)
没有你的对象标签上的id属性,这减少到
document.getElementById("").SetReturnValue(...)
它尝试在空对象上调用SetReturnValue。
请注意,其他浏览器不需要“id”属性,但也不会真正伤害。
您的情况可能会发生类似的情况: 嵌入式中的“名称”属性可能会有所帮助。
难道这是为了处理你创建Embed标签而不是Object标签的事实吗? IE传统上使用Object标签来嵌入Flash内容
请参阅Adobe技术讨论:http://kb2.adobe.com/cps/415/tn_4150.html
链接地址: http://www.djcxy.com/p/44359.html上一篇: How to call dynamically created flash external interface in IE from javascript?