Firefox的Flash外部接口问题

时间:2009-05-12 14:52:42

标签: javascript flash actionscript-3 externalinterface

我很难将ExternalInterface用于Firefox。我试图从javascript调用AS3函数。 SWF设置正确的回调,它在IE中工作。

我正在使用AC_RunActiveContent.js将swf嵌入到我的页面中。但是,我已修改它以向Object / Embed Tags添加ID。下面是分别为IE和Firefox生成的object和embed标记。

    <object codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="400" height="400" align="middle" id="jpeg_encoder2" name="jpeg_encoder3" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" >
    <param name="movie" value="/jpeg_encoder/jpeg_encoder3.swf" /> 
    <param name="quality" value="high" /> 
    <param name="play" value="true" /> 
    <param name="loop" value="true" /> 
    <param name="scale" value="showall" /> 
    <param name="wmode" value="window" /> 
    <param name="devicefont" value="false" /> 
    <param name="bgcolor" value="#ffffff" /> 
    <param name="menu" value="false" /> 
    <param name="allowFullScreen" value="false" /> 
    <param name="allowScriptAccess" value="always" /> 
</object>


<embed 
    width="400" 
    height="400" 
    src="/jpeg_encoder/jpeg_encoder3.swf" 
    quality="high" 
    pluginspage="http://www.macromedia.com/go/getflashplayer" 
    align="middle" 
    play="true" 
    loop="true" 
    scale="showall" 
    wmode="window" 
    devicefont="false" 
    id="jpeg_encoder2" 
    bgcolor="#ffffff" 
    name="jpeg_encoder3" 
    menu="false" 
    allowFullScreen="false" 
    allowScriptAccess="always" 
    type="application/x-shockwave-flash" > 
</embed>

我正在调用这个函数......

<script>
try {
    document.getElementById('jpeg_encoder2').processImage(z);
} catch (e) { alert(e.message); }
</script>

在Firefox中,我收到错误消息“document.getElementById("jpeg_encoder2").processImage is not a function

任何想法?

7 个答案:

答案 0 :(得分:2)

嗯,您是否使用addCallback将您的actionscript函数公开给Javascript?

Adobe documentation on addCallback

答案 1 :(得分:1)

以下是Flash电影如何放置在html页面中的示例。这部电影是非常简单的电影,一开始就有停止动作。电影如下所示,在测试运行主题下。这个特殊的html代码是由FlashMX的Publish命令自动生成的。请注意,Flash影片文件是simplemovie.swf;并且Flash已自动分配ID和名称以匹配电影文件名(减去.swf扩展名)。实际上,名称和id可以是任何东西(但不要使用开放的名称,尤其是,不要以数字开头),只要它没有被同一页面中的任何其他元素使用。

`codebase="http://download.macromedia.com/pub/shockwave/cabs/flash`/swflash.cab#version=6,0,0,0"  `WIDTH =“150”HEIGHT =“75”id =“simplemovie”ALIGN =“”&gt;           ` quality=medium    `swliveconnect =“true”   `bgcolor =#FFFFFF WIDTH =“150”HEIGHT =“75”    `name =“simplemovie”    `ALIGN =“”     `TYPE = “应用程序/ x-冲击波闪光”    `PLUGINSPAGE =“http://www.macromedia.com/go/getflashplayer”&gt;  

flash文件中有一个播放功能,以下函数将调用该函数:

function testEval(stringToEval)
{
  var movie=eval(stringToEval);
  if (movie)
  {
    if (movie.PercentLoaded())
    {
      if (movie.PercentLoaded()==100)
      {
        movie.Play();
      }
      else
      {
        alert("movie is still loading, try again soon");
      }
    }
    else
    {
      alert("movie object found-but unable to send command"); 
    }
  }
  else
  {
    alert("movie object not found");
  }
}

答案 2 :(得分:1)

请参阅此post

你想要一个更像这样的JS函数来检索Flash对象(而不是getElemById):

function thisMovie(movieName) {
  if(navigator.appName.indexOf("Microsoft") != -1) {
    return window[movieName];
  } else {
    return document[movieName];
  }
};

并确保在加载文档之前不要调用此函数。

答案 3 :(得分:0)

尝试在对象嵌入标记中使用相同的ID。我记得有一个浏览器使用一个标签而另一个浏览器使用另一个浏览器...不知道哪个是哪个。我前段时间遇到过同样的问题。

我通过修改flash附带的Example Code来解决这个问题。确保它有效,然后将其剥离并调整以供我使用。

在示例中,对象标记 id 标记为“ExternalInterfaceExample”,然后 embed 标记具有名称参数也设置为“ExternalInterfaceExample”。我想这可能是你的线索。

祝你好运!

答案 4 :(得分:0)

在您尝试拨打电话之前,您的SWF是否可见(在页面上)?如果没有,请阅读:swf-not-initializing-until-visible

答案 5 :(得分:0)

尝试以下两件事:

首先,尝试从Javascript中调用函数:

var swf;
if(navigator.appName.indexOf("Microsoft") != -1) {
    swf = window["jpeg_encoder2"];
} else {
    swf = document["jpeg_encoder2"];
}
if(typeof(swf) == "undefined") swf = document.getElementById("jpeg_encoder2");

swf.processImage(z);

其次,我发现Firefox中的ExternalInterface调用似乎只能用于嵌入标记,而不能用于对象标记。如果您只使用嵌入标记,请查看是否可以使其正常工作。 (现在,我不清楚您发布的HTML / Javascript组合是否会访问该对象或嵌入元素。)

答案 6 :(得分:0)

如果不是使用AC_RunActiveContent.js来嵌入你的flash影片而是使用swfobject,那么就有一种简单的内置方式。

<head>
 <script type="text/javascript" src="swfobject.js"></script>

 <script type="text/javascript">
 try {
      swfobject.getObjectById('jpeg_encoder2').processImage(z); 
      } catch (e) { alert(e.message); }
 </script>
</head>

如果您不使用swfObject,只需将 swfobject.getObjectById 直接复制并粘贴到您的代码中即可:

<script type="text/javascript">

function getObjectById(objectIdStr) {
        var r = null;
        var o = getElementById(objectIdStr);
        if (o && o.nodeName == "OBJECT") {
            if (typeof o.SetVariable != UNDEF) {
                r = o;
            }
            else {
                var n = o.getElementsByTagName(OBJECT)[0];
                if (n) {
                    r = n;
                }
            }
        }
        return r;

getObjectById('jpeg_encoder2').processImage(z); //call your method 
</script>