Javascript到Flash通信不起作用

时间:2011-03-31 04:58:54

标签: javascript flash actionscript externalinterface

我正试图通过javascript控制flash播放器, 我按照我在互联网上看到的那样做了一个“不支持”的错误

这里我写的是:

on js:

function getFlashMovieObject(movieName)
{
  if (window.document[movieName]) 
  {
      return window.document[movieName];
  }
  if (navigator.appName.indexOf("Microsoft Internet")==-1)
  {
    if (document.embeds && document.embeds[movieName])
      return document.embeds[movieName]; 
  }
  else // if (navigator.appName.indexOf("Microsoft Internet")!=-1)
  {
    return document.getElementById(movieName);
  }
}

function SetNum1()
{
    var x=getFlashMovieObject("flashmovie");
    x.Setvariable("z0", "Z0");
    //document.getElementById("flashmovie").setVariable("z0", "Z0");
    alert("hi");
}

on html:

<object id="flashmovie" width="40" height="300">
<param name="movie" value="complex Ex A2P.swf">
<embed src="complex Ex A2P.swf" width="400" height="300">
</embed>
</object>

注意:我试过“Setvariable”,“setvariable”,“SetVariable”和“setVariable”(大写字母的差异)

2 个答案:

答案 0 :(得分:0)

您可以在加载DOM后调用JS函数SetNum1 - 最简单的方法是将脚本放在</body>标记之前。

此外,您需要确保在AS代码中启用了Setvariable功能:

ExternalInterface.addCalback("Setvariable", setVariable); 
//the second parameter is the function name in the Actionscript code

答案 1 :(得分:0)

除了之前的推荐之外还有几件事情:

您需要确保您的Flash动画

<param name="allowscriptaccess" value="always">

在嵌入代码中。如果这不起作用,请尝试在javascript中注销该函数以确保它在调用之前存在,如

中所示
var x=getFlashMovieObject("flashmovie");
console.log("function", x.Setvariable);  // see what you get in your console log here

如果您在控制台中看到未定义,则可能存在排序问题,并且需要更改执行顺序以确保您的swf存在并且在调用之前添加了回调。在初始化的那一瞬间发生了很多事情,你想确保事情以正确的顺序发生。

最后,如果这仍然不起作用,可能存在安全问题,您可以通过添加

快速修复
Security.allowDomain('*');

在您的类定义(或您存储代码的任何位置)下的actionscript中。如果最后一项修复了问题,您可能需要查看Security.allowDomain,尤其是在使用ExternalInterface时,您可能会担心跨站点脚本攻击。在大多数情况下,这很好,但是如果您的swf可以访问您的数据库,将被其他站点或您自己站点的应该是安全的区域加载,那么最终可能会非常糟糕,因此请仅使用上面的全局解决方案小心。