【问题标题】:Flash External Interface issue with FirefoxFirefox 的 Flash 外部接口问题
【发布时间】:2010-10-25 14:08:22
【问题描述】:

我很难让 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

有什么想法吗?

【问题讨论】:

  • 也许你正在快速调用 processImage 函数。确保已加载 SWF 文件。将 OBJECT/EMBED 元素插入文档树后,浏览器需要一些时间来请求 SWF 文件。如果不是这样,请提供更多代码。
  • 该函数不会被调用 onLoad... 它稍后会根据用户交互发生。我已确保所有内容都已完全加载,但仍然存在同样的问题。
  • 刚刚使用我的 SWF 文件测试了您的代码(EMBED 标记)。它运作良好。请显示更多代码或检查 Firefox 和 IE 中的 Flash 播放器的版本。检查 getElementById 是否返回正确的元素。没有其他想法可能导致此问题。

标签: javascript flash actionscript-3 externalinterface


【解决方案1】:

如果不使用 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>

【讨论】:

    【解决方案2】:

    看到这个post

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

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

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

    【讨论】:

      【解决方案3】:

      以下是如何将 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 宽度="150" 高度="75" ` name="简单电影" `对齐=“” `TYPE="应用程序/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("找不到电影对象"); } }

      【讨论】:

        【解决方案4】:

        试试这两件事:

        首先,尝试像这样从 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 组合是否会访问对象或嵌入元素。)

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

            Adobe documentation on addCallback

            【讨论】:

              【解决方案7】:

              尝试在 objectembed 标记中使用相同的 id。我记得一个浏览器使用一个标签,另一个浏览器使用另一个……不知道哪个是哪个。前段时间我也遇到过同样的问题。

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

              在示例中注意 object 标签的 id 设置为“ExternalInterfaceExample”,然后 embed 标签具有 name 参数也设置为“ExternalInterfaceExample”。我想这可能是你的线索。

              祝你好运!

              【讨论】:

                猜你喜欢
                • 2011-01-09
                • 1970-01-01
                • 2010-12-05
                • 2010-10-23
                • 1970-01-01
                • 2019-06-11
                • 1970-01-01
                • 2011-06-20
                • 2010-12-10
                相关资源
                最近更新 更多