vini123

博客园 首页 新随笔 联系 订阅 管理

     先来简单的了解一个类:ExternalInterface

     ExternalInterface 类是外部 API,在 ActionScript 和 Flash Player 的容器之间实现直接通讯的应用程序编程接口,例如,含有 JavaScript 的 HTML 页。 推荐对所有 JavaScript 与 ActionScript 之间的通信使用 ExternalInterface

     在 HTML 页中使用 JavaScript,可以调用 Flash Player 中的 ActionScript 函数。 ActionScript 函数可以返回一个值,JavaScript 会立即接收它作为该调用的返回值。

     公共 属性(两个):

       (1)available : Boolean

           [static] [read-only] 指示此播放器是否位于提供外部接口的容器中。  

 

            指示此播放器是否位于提供外部接口的容器中。 如果外部接口可用,则此属性为 true;否则,为 false

            注意:将 External API 与 HTML 一起使用时,应始终在尝试调用任何 JavaScript 方法之前先检查 HTML 是否已完全加载。

           下面的示例使用 available 属性来确定播放器是否位于提供外部接口的容器中。 

           

package 
{
    import flash.text.TextField;
    import flash.display.MovieClip;
    import flash.external.ExternalInterface;

    public class extint_test extends MovieClip
    {
        public function extint_test()
        {
            var isAvailable:Boolean = ExternalInterface.available;
            var availTxt:TextField = new TextField();
            availTxt.text = isAvailable.toString();
            addChild(availTxt);
        }
    }
}

 

 

       (2)objectID : String
              [static] [read-only] 在 Internet Explorer 中,返回 <object> 标签的 id 属性;在 Netscape 中,返回 <embed> 标签的 name 属性。
 
              在 Internet Explorer 中,返回 <object> 标签的 id 属性;在 Netscape 中,返回 <embed> 标签的 name 属性。 
              实现 
          public static function get objectID():String
 
      公共 方法(两个):
      
        (1 ) addCallback(functionName:String, closure:Function):void
                 [static] 将 ActionScript 方法注册为可从容器调用。
               
               addCallback() 方法:
             public static function addCallback(functionName:String, closure:Function):void

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

                  安全提示:对于运行在浏览器中的 local 内容,只有当 SWF 文件以及包含网页位于 local-trusted 安全沙箱中时,对 ExternalInterfac全提示:对于运行在浏览器中的 local 内容,只有当 SWF 文件以及包含网页位于 local-trusted 安全沙箱中时,对 ExternalInterface.addCallback()方法的                           ExternalInterface.addCallback() 方法的调用才有效。 有关详细信息,请参阅以下部分:

参数

  functionName:String — 容器可用于调用函数的名称。
 
  closure:Function — 要调用的 closure 函数。 这可能是一个独立的函数,或者可能是引用对象实例方法的 closure 方法。 通过传递 closure 方法,回调实际上可以定向到特定对象实例的方法。 


引发

  Error — 如果容器不支持传入调用,将引发错误。 只有 Windows 的 Internet Explorer 和使用 NPRuntime API 的浏览器(如 Mozilla 1.7.5 及其更高版本,或 Firefox 1.0 及其更高版本)才支持。
 
  SecurityError — 您无权访问的沙箱中的 ActionScript 已经添加了具有指定名称的回调;您不能覆盖该回调。 通过使原来调用 addCallback() 方法的 ActionScript 也调用 Security.allowDomain() 方法,可以解决该问题。
 
  SecurityError — 包含环境属于调用代码无权访问的安全沙箱。 修正此问题:
  1. 在包含 HTML 页中的 SWF 文件的 <object>标签中,设置以下参数:

    <param name="allowScriptAccess" value="always" />

  2. 在 SWF 文件中,添加以下 ActionScript:

    flash.system.Security.allowDomain(sourceDomain)

 

 

 
       (2) call(functionName:String, ... arguments):*
                 [static] 调用由 Flash Player 容器公开的函数,不传递参数或传递多个参数。 

               call() 方法:
           public static function call(functionName:String, ... arguments):*

调用由 Flash Player 容器公开的函数,不传递参数或传递多个参数。 如果所需的函数不可用,则调用返回 null;否则,将返回由该函数提供的值。 允许使用递归;递归调用会生成 null 响应。

如果容器是 HTML 页,则此方法在 <script> 元素中调用 JavaScript 函数。

如果该容器是其它某个 ActiveX 容器,则此方法会使用指定的名称触发 FlashCall ActiveX 事件,并且该容器会处理该事件。

如果该容器承载 Netscape 插件,您可以写入对新 NPRuntime 接口的自定义支持或嵌入 HTML 控件以及在 HTML 控件内嵌入 Flash Player。 如果嵌入 HTML 控件,就可以通过与本机容器应用程序通迅的 JavaScript 接口与 Flash Player 进行通讯。

安全提示:对于运行在浏览器中的 local 内容,只有当 SWF 文件以及包含网页(如果有)位于 local-trusted 安全沙箱中时,才允许调用ExternalInterface.call()

方法。 还可以在包含 SWF 内容的 HTML 页中设置 objectembed 标签的 allowNetworking 参数,防止 SWF 文件使用此方法。 有关详细信息,请参阅以下部分:

参数

  functionName:String — 要在容器中调用的函数的名称。
 
  ... arguments — 传递到容器中的函数的参数。 您可以指定零个或多个参数,参数之间用逗号分隔。 这些参数可以是任何 ActionScript 数据类型。 当调用 JavaScript 函数时,ActionScript 类型自动封装到 JavaScript 类型中;当调用其它某个 ActiveX 容器时,将在请求消息中对参数进行编码。

 

返回
  * — 从容器接收的响应。 如果调用失败(例如,当容器中没有这种函数时、接口不可用时、发生递归时,或出现安全问题时),则返回 null 并引发错误。

引发
  Error — 如果容器不支持传出调用,将引发错误。 只有 Windows 的 Internet Explorer 和使用 NPRuntime API 的浏览器(如 Mozilla 1.7.5 及其更高版本,或 Firefox 1.0 及其更高版本)才支持。
 
  SecurityError — 包含环境属于调用代码无权访问的安全沙箱。 通过给包含环境中的 allowScriptAccess 设置一个合适的值(通常通过使用 HTML 中的 allowScriptAccess <object> / <embed> 标签来进行),可以解决此问题。 
    
 
****************************************以上这些是帮助文档里边的,下边是网上的****************************************
 

ExternalInterface类是实现JavaScript与ActionScript之间通信的编程接口,其中addCallback()方法使用最广泛,该方法将ActionScript方法注册为可从容器调用。如果浏览器不支持调用或无权访问的安全沙箱,将引发错误,大家可以参考帮助解决这些常见问题。本文讲述的实际应用中使用addCallback()方法容易犯的其它两个错误。

1. 错误:对象不支持此属性或方法。这是因为ActionScript方法还没注册成功就在容器中调用。最简单的解决方法是在注册ActionScript方法后,使用call()方法调用容器的一个的函数来检验注册状态,注册成功后再在该函数体中调用ActionScript方法。

在本实例中,如果使用<body onload="selectCatalog(1)">就会出现上述错误。如果在注册addCallback()方法后,使用call()方法调用isReady()函数,再在该函数中调用selectCatalog(1)函数就没有问题了。

2. 错误:IE能成功调用addCallback(),而Firefox却没有反应。这是因为它们对swf对象的引用语法不一样,IE中用window[movieName],而Firefox中使用document[movieName],需要判断一下浏览器的类型再分别处理,或者用document.getElementById("movieName")。

在本实例中,如果使用Main.getSongList(data)就会出现上述错误,我们使用thisMovie函数解决了这一问题。

文章来源:http://rss.9ria.com/?p=1912

 

在AS3编程中,如果我们要JavaScript来调用AS3中的函数,常用的方法就是使用ExternalInterface类中的addCallback方法。该方法官方解释如下:将 ActionScript 方法注册为可从容器调用。 成功调用 addCallBack() 后,容器中的 JavaScript 或 ActiveX 代码可以调用在 Flash Player 中注册的函数。

在AS3中,该方法的原始定义如下

public static function addCallback(functionName:String, closure:Function):void

他有2个参数,第一个参数指的是AS3中需要调用的函数名,第二个参数则是JS中调用的函数名,我们看AS3中关于这个函数的使用帮助中有如下说明:

在包含 SWF 文件的 HTML 页中,在该文件的 object 标签中设置以下参数:

<param name="allowScriptAccess" value="always" />

在 SWF 文件中,添加以下 ActionScript:

flash.system.Security.allowDomain(sourceDomain )

这2个说明其实是为了解决安全沙箱的问题,但是实际使用中,我们常常还会遇到更加头疼的问题。

比如AS3中有个函数叫

showMC(mc:MovieClip):void;

我们使用

ExternalInterface.addCallback("showMC" , jsshowMC) ;

来注册一个外部接口函数,ok,我们同样设置allowScriptAccess为always和allowDomain(*),但是JS经常还是会报错:jsshowMC is not a Function,这是为什么呢?进过多次试验,原来才发现,AS3中,如果需要使用addCallback函数来注册外部函数接口,那么必须是当前的swf完全加载完毕才能注册成功,如果还在当前swf加载的过程中就在JS中调用的话肯定会因为找不到函数而报错。

解决办法有几个,一个是swf尽可能的小,提高加载速度,当然这个指标不治本,那么,我们可以在JS中来判断所调用的函数是否有效,如果所调用的函数未定义,那么我们就等待,比如我们可以用一个Timer:setTimeout("checkFuncName()",100);每隔100毫秒来调用checkFuncName检测函数是否有效,checkFuncName里我们可以写检测函数是否是undefined,如果是就继续循环。

这个问题曾经困扰了我1个小时,刚开始一直以为是安全沙箱的限制,最后才发现是因为swf未加载完毕导致函数没有注册,希望有类似情况的朋友不妨试一试。

文章来源:http://tech.cncms.com/tuxing/flash/93749.html

posted on 2012-06-13 09:36  黑夜丶残枫  阅读(1449)  评论(0)    收藏  举报