`
hereson
  • 浏览: 1443993 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

ExternalInterface在Firefox下出错的bug

    博客分类:
  • flex
阅读更多

使用Document Class为避免命名空间冲突,通常会取消Automatically dedare stage instances(自动声明舞台实例)设置。这样会导致一个诡异的问题:Firefox下的ExternalInterface.callback会失 效。另外,使用flash.external.ExternalInterface全名而不是直接使用ExternalInterface,也会避免 Firefox各版本下的一部分奇怪的问题。

下面是一个刚写的一个ExternalInterface的扩展类,用于判断ExternalInterface是否可用。

view plainprint?
package cn.myspace.actionscript.utils  
{  
  import flash.events.Event;  
  import flash.events.EventDispatcher;  
  import flash.events.IEventDispatcher;  
  import flash.events.TimerEvent;  
  import flash.external.ExternalInterface;  
  import flash.utils.Timer;  
  
  public class ExternalInterfaceUtil extends EventDispatcher  
  {  
    //////////////////////////////////////////////////////////////////////  
    //ExternalInterface Setting  
    public static const EXTERNAL_ISREADY:String = "isReady";  
    public static const EXTERNAL_DEBUG:String = "displayDebug";  
      
    //////////////////////////////////////////////////////////////////////  
    //Event type  
    public static const EXTERNAL_READY:String = "externalReady";  
    public static const EXTERNAL_OUT_OF_TIME:String = "externalOutOfTime";  
      
    //////////////////////////////////////////////////////////////////////  
    //class setting  
    private const MAX_COUNT:uint = 30;  
      
    private var readyTimeCounter:int = 0;  
          
    public function ExternalInterfaceUtil(target:IEventDispatcher=null)  
    {  
      super(target);  
      this.registerExternalInterface();  
    }  
      
    //////////////////////////////////////////////////////////////////////  
    //private  
          
    private function registerExternalInterface():void  
    {        
      if(flash.external.ExternalInterface.available)  
      {  
        try  
        {            
          if(this.isContainerReady)  
          {  
            setupCallBacks();  
          }  
          else  
          {  
            var readyTimer:Timer=new Timer(100);  
            readyTimer.addEventListener(TimerEvent.TIMER,onTimer_handler);  
            readyTimer.start();  
          }  
        }  
        catch(e:Error)  
        {  
            
        }  
      }  
        
    }  
      
    private function get isContainerReady():Boolean  
    {  
       var result:Boolean=Boolean(flash.external.ExternalInterface.call(ExternalInterfaceUtil.EXTERNAL_ISREADY));  
       return result;  
     }  
       
     private function onTimer_handler(e:TimerEvent):void  
     {  
       if(this.isContainerReady)  
       {  
         Timer(e.target).stop();  
         setupCallBacks();  
       }  
       else  
       {  
         if(this.readyTimeCounter < this.MAX_COUNT)  
           this.readyTimeCounter++;  
         else  
         {  
           Timer(e.target).stop();    
           this.dispatchEvent(new Event(ExternalInterfaceUtil.EXTERNAL_OUT_OF_TIME));  
         }  
             
       }  
     }  
       
     private function setupCallBacks():void  
     {  
       this.dispatchEvent(new Event(ExternalInterfaceUtil.EXTERNAL_READY));  
     }  
  }  
}  
package cn.myspace.actionscript.utils {   import flash.events.Event;   import flash.events.EventDispatcher;   import flash.events.IEventDispatcher;   import flash.events.TimerEvent;   import flash.external.ExternalInterface;   import flash.utils.Timer;    public class ExternalInterfaceUtil extends EventDispatcher   {     //////////////////////////////////////////////////////////////////////     //ExternalInterface Setting     public static const EXTERNAL_ISREADY:String = "isReady";     public static const EXTERNAL_DEBUG:String = "displayDebug";          //////////////////////////////////////////////////////////////////////     //Event type     public static const EXTERNAL_READY:String = "externalReady";     public static const EXTERNAL_OUT_OF_TIME:String = "externalOutOfTime";          //////////////////////////////////////////////////////////////////////     //class setting     private const MAX_COUNT:uint = 30;          private var readyTimeCounter:int = 0;              public function ExternalInterfaceUtil(target:IEventDispatcher=null)     {       super(target);       this.registerExternalInterface();     }          //////////////////////////////////////////////////////////////////////     //private              private function registerExternalInterface():void     {             if(flash.external.ExternalInterface.available)       {         try         {                     if(this.isContainerReady)           {             setupCallBacks();           }           else           {             var readyTimer:Timer=new Timer(100);             readyTimer.addEventListener(TimerEvent.TIMER,onTimer_handler);             readyTimer.start();           }         }         catch(e:Error)         {                    }       }            }          private function get isContainerReady():Boolean     {        var result:Boolean=Boolean(flash.external.ExternalInterface.call(ExternalInterfaceUtil.EXTERNAL_ISREADY));        return result;      }            private function onTimer_handler(e:TimerEvent):void      {        if(this.isContainerReady)        {          Timer(e.target).stop();          setupCallBacks();        }        else        {          if(this.readyTimeCounter < this.MAX_COUNT)            this.readyTimeCounter++;          else          {            Timer(e.target).stop();              this.dispatchEvent(new Event(ExternalInterfaceUtil.EXTERNAL_OUT_OF_TIME));          }                    }      }            private function setupCallBacks():void      {        this.dispatchEvent(new Event(ExternalInterfaceUtil.EXTERNAL_READY));      }   } }

使用:


private function initExternalInterfaceUtil ():void
{
  var ext:ExternalInterfaceUtil = new ExternalInterfaceUtil();
  ext.addEventListener(ExternalInterfaceUtil.EXTERNAL_READY, onReady_handler);
}

private function onReady_handler(e:Event):void
{
  //flash.external.ExternalInterface.addCallback(this.AS_DEBUG, displayDebugInformation);
  //flash.external.ExternalInterface.addCallback(this.AS_PLAY, startPlay);
}


在页面上,添加如下JS:

<script>
var jsReady = false;
var flashMovie;
function isReady()
{
  return jsReady;
}
function init()
{
  jsReady = true;
  if (document.getElementById)
  {
    flashMovie = document.getElementById("flashObject");
  }

}

window.onload = init;

function callExternalInterface()
{
  if (flashMovie)
  {
    flashMovie.startPlay();
  }
}
</script>

<div id="flashcontent"></div>

<script type="text/javascript">
  var fo = new SWFObject("flashEXTest.swf", "flashObject", "300", "350", "8.0.15", "#ffffff", true);
  fo.addParam("wmode", "opaque");
  fo.addParam("allowScriptAccess", "always");
  fo.write("flashcontent");
</script>

分享到:
评论

相关推荐

    ExternalInterface

    需要注意的是,`addCallback`仅在某些特定环境下有效,如Windows上的Internet Explorer使用NPRuntime API,以及Mozilla 1.7.5及更高版本的Firefox。在不支持的环境中尝试使用`addCallback`可能会触发`SecurityError`...

    flex与js交互 关于ExternalInterface使用的小例子

    1. **启用ExternalInterface**:在Flex中,首先需要确保ExternalInterface可用。在Flex组件或MXML文件中,可以通过`ExternalInterface.available`属性检查其是否已被浏览器支持。如果可用,可以继续进行交互;如果不...

    delphi通过ExternalInterface与flash交互

    ExternalInterface在我看来就是flash为了外部程序的调用所声明的接口。看到论坛里有好多人问但是回答的就不是很多,就把自己做的一个简单的例子放上来.写的不好,希望能抛砖引玉,大侠勿拍!!这个是里面用到的flash...

    ★★★同时支持iexplorer和firefox的javascript复制拷贝信息到剪贴板方法

    标题中的“同时支持iexplorer和firefox的javascript复制拷贝信息到剪贴板方法”指的是在Web开发中,使用JavaScript实现跨浏览器(包括Internet Explorer和Firefox)的信息复制功能。JavaScript是一种广泛使用的...

    as3.0利用ExternalInterface与js交互的播放器

    在本文中,我们将深入探讨如何在AS3.0(ActionScript 3.0)中使用ExternalInterface类与JavaScript进行交互,特别是在实现一个自定义播放器的场景中。这个主题是针对那些希望在网页中集成Flash内容并与网页的...

    AS3与C#交互,有返回值

    - **调用方法**:通过`ExternalInterface.call`在AS3端调用C#中的方法。 - **处理返回值**:C#端通过`axShockwaveFlash1.SetReturnValue`设置返回值。 - **事件处理**:C#端使用`axShockwaveFlash1_FlashCall`事件...

    OpenSPARCT1_ExternalInterface.pdf

    特别是在需要高并发处理能力和强大计算性能的场景下,OpenSPARCT1处理器展现出了其独特的优势。 #### 七、知识产权声明 文档明确指出,Sun Microsystems拥有与OpenSPARCT1处理器相关的多项知识产权。这包括但不...

    flash与java交互的方法

    在Flash与Java交互的过程中,核心机制是通过Flash Player提供的`ExternalInterface`类实现ActionScript方法与容器(例如网页浏览器)中的JavaScript或ActiveX代码之间的调用。这使得开发人员能够在Flash应用程序内部...

    Flex3与javascript相互交互验证

    首先,你需要确保浏览器支持`ExternalInterface`,如现代的Chrome、Firefox、Safari和Internet Explorer。 1. **启用ExternalInterface** 在Flex中,首先需要检查`ExternalInterface`是否可用,因为并非所有浏览器...

    复制Input内容的js代码_支持所有浏览器,修正了Firefox3.5以上的问题

    - Firefox等浏览器出于安全考虑,默认不允许通过脚本直接复制内容到剪贴板。 - 在较老版本的IE浏览器中,可以直接通过脚本复制内容,但在较新版本中会出现安全提示,提示用户可能受到恶意脚本影响。 2. Flash解决...

    AS3与JS交互通信(使用swfObject插入Flash)

    ·Firefox 14 ·Chromium 22 ·Chrome 21 (*Chrome 21使用新的PPAPI类型Flash Player插件,由于其安全沙箱特性,无法在本地进行访问,因此需要在互联网或IIS等虚拟站点测试运行。禁用PPAPI使用NPAPI类型的Flash ...

    flex和javascript交互例子

    例如,开发者可能使用Firefox的Firebug或Chrome的Developer Tools来调试这些交互,查看网络请求,检查DOM结构,以及理解JavaScript和Flex之间的通信过程。 文件列表中的"flexjavascript"可能包含了一个实际的示例...

    兼容浏览器的单击按钮复制到剪切板

    标题所提及的问题在于,这个功能在不同浏览器上可能存在兼容性问题,例如IE(Internet Explorer)通常可以支持,但Firefox(火狐浏览器)可能无法正常工作。为了解决这个问题,开发者们常常会采用多种技术,如Flash...

    flash录音兼容问题得到解决

    然而,随着HTML5的发展和安全性的考虑,Flash逐渐被淘汰,尤其是各大浏览器如谷歌Chrome、微软IE(现已被Edge取代)和Mozilla火狐Firefox等已经或计划停止对Flash的支持。在这种背景下,“flash录音兼容问题得到解决...

    SWF(ActionScript3.0)与JavaScipt(JS)通信示例

    在ActionScript3.0与JavaScipt通信的时候需要用到ExternalInterface类。 “ExternalInterface”类是外部API,在ActionScript和FlashPlayer的容器之间实现直接通讯的应用程序编程接口,例如,含有JavaScript的HTML页...

    flex iframe js

    在Flex应用的场景下,IFrame常用于在Web页面中嵌入由Flex技术构建的富互联网应用程序(RIA)。 Flex是基于ActionScript的一个开源框架,用于创建高性能、跨平台的RIA。ActionScript是Adobe Flash Platform的主要...

    AS3.0与JS交互

    在现代Web开发中,Flash(ActionScript 3.0,简称AS3.0)与JavaScript(JS)的交互是常见的技术需求,特别是在实现富互联网应用(RIA)时。这种交互能力使得网页上的Flash内容能够与JavaScript环境进行通信,从而...

    js调用AS flash函数

    在现代Web开发中,JavaScript(JS)和Adobe Flash(AS,ActionScript)是两种常见的交互技术,它们在...在实践中,开发者需要考虑安全、兼容性和数据转换等问题,以确保在各种浏览器和Flash Player环境下都能正常工作。

    JavaSript访问flash例子

    5. **处理兼容性问题**:在某些情况下,尤其是Internet Explorer,可能需要额外的配置来确保`ExternalInterface`正常工作,例如设置正确的Flash Player安全设置。 6. **测试和调试**:确保在各种浏览器和环境中进行...

    flex与flash cs 交互

    在Flash CS中,你需要为需要触发事件的对象添加事件监听器,并在事件触发时调用`ExternalInterface`暴露一个方法。例如,一个按钮的点击事件处理函数可能如下: ```as3 button.addEventListener(MouseEvent.CLICK, ...

Global site tag (gtag.js) - Google Analytics