问题访问ExternalInterface的暴露方法,谷歌浏览器(Problem accessing

2019-07-18 07:31发布

我简单的ActionScript我想使用Flash的ExternalInterface的设置回调使JavaScript可以调用一个方法,我的Flash对象。 一切都在Safari,Firefox和IE中工作正常,但我不能让Chrome的工作。 当我尝试在Chrome的代码,我得到以下错误:

未捕获的类型错误:对象#<一个HTMLObjectElement>没有方法“的setText”

下面是我使用的HTML示例(再次,在Safari,FF和IE浏览器正常工作)

<html><body>
<div id="mycontent"></div>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"></script>
<script type="text/javascript">
swfobject.embedSWF("http://invincible.dynalias.com:8080/HelloWorld.swf", "mycontent", "400", "420", "9.0.0","expressInstall.swf", {}, {allowScriptAccess:'always'},{id:'hw',name:'hw'});

function getFlash(movieName) {
   return ( navigator.appName.indexOf("Microsoft") != -1) ? window[movieName] : document.getElementById(movieName);
}
</script><p>
  <input type="text" id="exampleText" /> <input type="button" value="Set Text" onclick="getFlash('hw').setText(document.getElementById('exampleText')
.value)" />
</body>
</html>

这里是ActionScript ...

package {
  import flash.display.Sprite;
  import flash.text.TextField;
  import flash.external.ExternalInterface;
  import flash.system.Security;

  public class HelloWorld extends Sprite {

    private var textField:TextField = new TextField();
    public function HelloWorld() {
      Security.allowDomain("*");
      ExternalInterface.addCallback("setText", this.setText);
      textField.text = "Hello, world!";
      addChild(textField);
    }   
    public function setText(text:String):void {
      this.textField.text = text;
    }   
  }
}

Answer 1:

我得到了同样的问题,火灾和收到JavaScript和Flash之间的监听器事件。

解决的办法是使用AC_OETags.js文件从Adobe为使嵌入的脚本,而不是JQuery的闪光。 (这是根据客户端检测的zip文件中,Adobe公司可能有它的一些其他地方也一样)

麻烦的基础上的竞争条件,当闪光灯建立在浏览器中的JavaScript回调。 这不是由直线嵌入某种原因正确handeled。

<div>
<script>
// Major version of Flash required
var requiredMajorVersion = 10;
// Minor version of Flash required
var requiredMinorVersion = 0;

var hasRequestedVersion = DetectFlashVer(requiredMajorVersion, requiredMinorVersion, requiredRevision);
AC_FL_RunContent(
"src", "tagflash",
    "width", "200",
    "height", "200",
    "id", "myTagFlash",
    "quality", "high",
    "bgcolor", "#FFFFFF",
    "name", "myTagFlash",
    "allowScriptAccess","always",
    "type", "application/x-shockwave-flash",
    "pluginspage", "http://www.adobe.com/go/getflashplayer",
    "flashvars", "templateData=theYear:2010&theTagNumber:123"
);
</script>
</div>

然后,你可以这样做:(在IE中,FF,Safari浏览器,克罗姆作品,++)

$("#tagFlash").gotoNewFrame();


Answer 2:

我同意罗布森,这是一个竞争条件,但它不是在创作中的闪光标签“,并添加一个计时器不是一个很好的解决方案 - 实际上它很危险。

问题是,在SWF本身不加载,并有机会来初始化外部接口。 在Chrome小SWF的定时可以比其它的browers更敏感,但潜在的问题是不是特定于浏览器。

你需要做的是这样的:

在ActionScript

呼叫从自己构造这样的功能:

public function InitializeExternalInterface():void 
{   
      if (ExternalInterface.available) {

           // register actionscript functions so they can be called by JS   
           ExternalInterface.addCallback("activate", activate);
           Security.allowDomain("www.example.com");     

           // send message to parent page that SWF is loaded and interface active
           trace("External Interface Initialized...");
           ExternalInterface.call("flashInitialized")
      }
      else 
      {
          trace("ERROR: External Interface COULD NOT BE Initialized...");
      } 
}

在你的HTML

 <script>

     function flashInitialized() 
     {
         alert("Initialized!");      // remove this obviously!
         $('#Main')[0].activate();   // safe to call Flash now
     }

 </script>

您可以在本地计算机上发现,它的工作原理没有这一点,但只要你添加网络延迟入公式,你会后悔没有这样做。 任意定时器是一个坏主意,因为你仍然会得到一个缓慢的连接错误。 这种方式使页面调用尽早时间flash对象。


注意:使用jQuery的“现成”的格局是不是解决问题的办法-尽管最初我误以为它之一。

$(function() 
{
   $('#animation')[0].SetTitle("Hello"); 
} 

另外的SWFObject的callbackFn也不是一个解决方案becasue,只是告诉你什么时候插入标签,而不是在加载的SWF。



Answer 3:

我是有ExternalInterface的和Firefox和Chrome的问题和发现的Adobe脚本不写的闪光标签的速度不够快,所以当浏览器试图找到的addCallback()函数,它是不存在的时间。

干脆把我的JavaScript函数调用Flash创建的的addCallback()在window.setTimeout()调用解决了这个问题。 延迟小于200毫秒仍然让要发生的问题。

我没有用试图找到,如果在文档[FlashId]对象存在的“长度”属性的解决方案。 只需调用“FlashEmbed =文件[FlashId]”工作得很好。



Answer 4:

挣扎了很多之后,我终于决定从Adobe使用官方的解决方案:

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/external/ExternalInterface.html

搜索ExternalInterfaceExample.as



Answer 5:

有通过停用Chrome内置Flash插件解决方法的问题:

  1. 键入铬://插件在Chrome浏览器的地址栏中。
  2. 通过点击右上角的细节扩展插件的详细信息。
  3. 在“的Adobe Flash Player”的入口,禁用第一个。

这不是一个解决方案,但说明了为什么这种情况在Chrome。 Chrome的陪伴与内置Flash插件,这往往会造成麻烦,当我们使用AS3的ExternalInterface的,这很烦人。



文章来源: Problem accessing ExternalInterface exposed method in Google Chrome