6

我的简单 ActionScript 我正在尝试使用 Flash 的ExternalInterface来设置回调,以便 JavaScript 可以调用我的 Flash 对象上的方法。在 Safari、Firefox 和 IE 中一切正常,但我无法让 Chrome 正常工作。当我在 Chrome 上尝试代码时,出现以下错误:

Uncaught TypeError: Object #<an HTMLObjectElement> has no method '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>

这是动作脚本...

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;
    }   
  }
}
4

5 回答 5

13

我同意 Robson 的观点,即这是一种竞争条件,但不是在“编写 Flash 标签”中,并且添加计时器不是一个好的解决方案——事实上它非常危险。

问题是 SWF 本身没有加载并且有机会初始化您的外部接口。对于 Chrome 中的小型 SWF,时间可能比其他浏览器更敏感,但根本问题并非特定于 Chrome。

你需要做的是:

在动作脚本中

从您的构造函数调用此函数:

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"); 
} 

swfobjectcallbackFn也不是一个解决方案,因为它只会告诉您何时插入标签,而不是何时加载 SWF。

于 2011-03-14T02:30:58.940 回答
3

我在使用 ExternalInterface 和 Firefox 和 Chrome 时遇到问题,发现 Adob​​e Script 写入 Flash 标签的速度不够快,所以当浏览器试图找到 addCallback() 函数时,它当时不存在。

只需将调用 Flash 创建的 addCallback() 的 Javascript 函数放在 window.setTimeout() 调用中即可解决问题。小于 200 毫秒的延迟仍然会导致问题发生。

我不必使用尝试查找“length”属性是否存在于 document[FlashId] 对象中的解决方案。只需调用“FlashEmbed = document[FlashId]”就可以了。

于 2009-12-08T14:58:52.353 回答
3

我遇到了同样的问题,在 javascript 和 flash 之间触发和接收侦听器事件。

解决方案是使用 Adob​​e 的AC_OETags.js文件作为嵌入脚本而不是 JQuery flash。(它在客户端检测下的 zip 文件中找到,Adobe 可能在其他地方也有)

当 flash 在浏览器中构建 javascript 回调时,基于竞争条件的问题。由于某种原因,直接嵌入无法正确处理此问题。

<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、Crome、++)

$("#tagFlash").gotoNewFrame();
于 2011-04-18T10:51:41.743 回答
0

经过一番苦苦挣扎,我终于决定使用Adobe官方的解决方案:

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

搜索ExternalInterfaceExample.as

于 2012-01-24T21:55:13.390 回答
0

通过禁用 Chrome 内置 Flash 插件可以解决此问题:

  1. 在 chrome 的地址栏中输入 chrome://plugins。
  2. 单击右上角的详细信息展开插件的详细信息。
  3. 在“Adobe Flash Player”的条目中,禁用第一个。

这不是一个解决方案,但说明了为什么在 Chrome 上会发生这种情况。Chrome自带了一个flash插件,在我们使用AS3的ExternalInterface时经常会遇到麻烦,很烦人。

于 2013-08-15T08:56:14.623 回答