1

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

我正在使用 AC_RunActiveContent.js 将 swf 嵌入到我的页面中。但是,我已经对其进行了修改,以将 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

有任何想法吗?

4

7 回答 7

2

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

关于 addCallback 的 Adob​​e 文档

于 2009-05-25T08:44:45.310 回答
1

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

`codebase="http://download.macromedia.com/pub/shockwave/cabs/flash`/swflash.cab#version=6,0,0,0" ` WIDTH="150" HEIGHT="75" id="simplmovie" ALIGN=""> ` quality=medium ` swliveconnect="true" ` bgcolor=#FFFFFF WIDTH="150" HEIGHT="75" ` name="simplmovie" ` ALIGN ="" `TYPE="application/x-shockwave-flash" `PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer">

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

函数 testEval(stringToEval)
{
  var 电影=eval(stringToEval);
  如果(电影)
  {
    if (movie.PercentLoaded())
    {
      if (movie.PercentLoaded()==100)
      {
        电影.Play();
      }
      别的
      {
        alert("电影还在加载中,请稍后再试");
      }
    }
    别的
    {
      alert("找到电影对象-但无法发送命令");
    }
  }
  别的
  {
    alert("找不到电影对象");
  }
}
于 2011-01-18T13:37:24.510 回答
1

看到这个帖子

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

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

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

于 2011-03-15T20:11:38.683 回答
0

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

我通过修改Flash 附带的示例代码来解决问题。确保它有效,然后将其剥离并调整以供我使用。

在示例中,请注意对象标签的id设置为“ExternalInterfaceExample”,然后嵌入标签的名称参数也设置为“ExternalInterfaceExample”。我想这可能是你的线索。

祝你好运!

于 2009-05-13T15:17:54.140 回答
0

在您尝试调用它们之前,您的 swf 是否可见(在页面上)?如果没有,请阅读:swf-not-initializing-until-visible

于 2010-05-05T23:23:41.747 回答
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 组合是否会访问对象或嵌入元素。)

于 2010-08-25T05:46:29.443 回答
0

If instead of using AC_RunActiveContent.js to embed your flash movie you use swfobject there is a easy build-in way of doing that.

<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>

If you are not using swfObject you could just copy and paste swfobject.getObjectById straight in to your code:

<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>
于 2011-04-25T09:09:58.923 回答