Flash8的ExternalInterface.addCallback

addCallback(ExternalInterface.addCallback 方法)

public static addCallback(methodName:String, instance:Object, method:Function) : Boolean

将 ActionScript 方法注册为可从容器调用。成功调用 addCallBack() 后,容器中的 JavaScript 或 ActiveX 代码可以调用在 Flash Player 中注册的函数。

可用性:ActionScript 1.0;Flash Player 8

参数

methodName:String - 从 JavaScript 调用 ActionScript 函数时可使用的名称。此名称不必与 ActionScript 方法的实际名称匹配。

instance:Object - this 在该方法中被解析成的对象。此对象不一定是在其上可找到该方法的对象,您可以指定任何对象(或 null)。

method:Function - 要从 JavaScript 调用的 ActionScript 方法。

返回

true - 如果调用成功,则返回 Boolean。如果调用由于下列原因而失败,则返回 false:实例不可用、遇到了安全限制、没有这种函数对象、发生了递归或类似情况。

返回值为 false 还可能表示包含环境属于调用代码无权访问的安全沙箱。您可以在包含环境的 HTML 中为 allowScriptAccess OBJECT 标签或 EMBED 标签设置一个合适的值,以解决此问题。

示例

下面的示例将 goToMacromedia() 函数注册为可使用名称 goHome 从容器调用。

 
  1. import flash.external.*;
  2. var methodName:String = "goHome";
  3. var instance:Object = null;
  4. var method:Function = goToMacromedia;
  5. var wasSuccessful:Boolean = ExternalInterface.addCallback(methodName, instance, method);
  6. var txtField:TextField = this.createTextField("txtField"this.getNextHighestDepth(), 0020050);
  7. txtField.border = true;
  8. txtField.text = wasSuccessful.toString();
  9. function goToMacromedia() {
  10.     txtField.text = "http://www.macromedia.com";
  11.     getURL("http://www.macromedia.com""_self");
  12. }

为了使上一示例能够正常运行,应复制以下代码并将其粘贴到包含 HTML 页中。此代码依赖 OBJECT 标签的 id 属性和 EMBED 标签的 name 属性以获得值 externalInterfaceExample。由于 Internet Explorer 和 Netscape 以不同方式引用 movie 对象,所以函数 thisMovie 根据浏览器返回相应的语法。除非服务器上承载 HTML 页,否则您的浏览器可能会出现安全警告。

注意:请避免使用访问插件对象的其它方法(如 document.getElementById("pluginName")document.all.pluginName),因为这些其它方法在所有浏览器上的运行不一致。

 

   
   
  1. <form>
  2.     <input type="button" onclick="callExternalInterface()" value="Call ExternalInterface" />
  3. </form>
  4. <script>
  5. function callExternalInterface() {
  6.     thisMovie("externalInterfaceExample").goHome();
  7. }
  8. function thisMovie(movieName) {
  9.     if (navigator.appName.indexOf("Microsoft") != -1) {
  10.         return window[movieName]
  11.     }
  12.     else {
  13.         return document[movieName]
  14.     }
  15. }
  16. </script>
我很好奇这个函数是怎么和javascript交互的。经过仔细探索,我发现当在flash中第一次调用ExternalInterface.addCallback 的时候execScript了以下内容:

 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, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");

}


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;

}
而每次调用ExternalInterface.addCallback 的时候都会运行js的__flash__addCallback。这里要注意,instance参数就是网页上的插件,对于IE来说,是一个实现了IDispatch的ActiveX控件,这个控件有一个方法,即CallFunction,该方法就可以调用flash中的函数了。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值