【问题标题】:Javascript to Flash communication doesn't workJavascript 到 Flash 通信不起作用
【发布时间】:2011-03-31 04:58:53
【问题描述】:

我正在尝试通过 javascript 控制 Flash 播放器, 我做了我在互联网上看到的,我得到一个“不支持”的错误

这里是我写的:

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

在 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”(大写字母的差异)

【问题讨论】:

  • 你确定complex Ex A2P.swf在你调用的时候被初始化了,你确定它拥有Setvariable方法吗?
  • 确保 setVariable 是您的 actionscript 代码中接受 2 个参数的函数。在 url 中放置空格也是不好的做法

标签: javascript flash actionscript externalinterface


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    您需要确保您的 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 可以访问您的数据库,将被其他站点加载,或者您自己站点的应该安全的区域,那么它最终可能会非常糟糕,因此仅使用上面的全局解决方案小心。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-05
      • 2020-08-23
      • 1970-01-01
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多