【问题标题】:Adobe ExternalInterface not working in IE9Adobe ExternalInterface 在 IE9 中不起作用
【发布时间】:2011-07-20 13:56:36
【问题描述】:

我正在从 JavaScript 调用 Actionscript 函数,它适用于除 IE9 之外的所有浏览器。我把它缩小到检索电影对象的 js 函数:

<script type="text/javascript"> 
var swf;
... 

function flashReady() // This is called from ActionScript
{
    swf = getSWF("MyMovie");
    swf.MyExternalFunction(); 
}

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

这是我的 HTML:

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="1" height="1" id="MyMovie">
    <param name="allowScriptAccess" value="always" />
    <param name="movie" value="/swf/movie.swf" />
    <param name="quality" value="high" />
    <param name="bgcolor" value="#ffcc00" />
    <embed src="/swf/movie.swf" quality="high" bgcolor="#ffcc00" width="1" height="1" name="MyMovie" align="middle" allowScriptAccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>

当我这样调用外部函数时:

swf.MyExternalFunction(); 

在 IE9 中我得到一个 JS 错误:

"Object doesn't support property or method 'MyExternalFunction'" 

显然window[movieName] 对IE 很好,但在IE9 中却不像以前那样工作了。 有什么建议吗?

:::UPDATE:::

到目前为止,这是我的解决方案。它可能看起来不漂亮,但它确实有效:

var movie = false;

function initSWF(movieName) {
    if (navigator.appName.indexOf("Microsoft") != -1) {
        //alert("IE");
        if (typeof (window[movieName].MyExternalFunction) == 'function') {
            // alert("< IE9");
            movie = window[movieName];
        }
        else if (typeof (document[movieName].MyExternalFunction) == 'function') {
            // alert(">= IE9");
            movie = document[movieName];
        }
    }
    else {
        // alert("NON IE");
        movie = document[movieName];
    }

    return ((movie) ? true : false);
}

然后使用如下:

function flashReady() // This is called from ActionScript
{
    if(initSwf("MyMovie")) {
        movie.MyExternalFunction();
    } else {
        alert("Failed to initialize");
    }
}

【问题讨论】:

  • 可能不相关,但您应该使用&lt;script type="text/javascript"&gt; 而不是&lt;script language="JavaScript"&gt;
  • 是的,谢谢,我实际上使用了type="text/javascript",但这应该没关系。
  • 你什么时候调用你的外部函数?调用 Flash 对象时可能未加载它。另外我们不是在 1990 年,document.getElementById 适用于所有浏览器,请勿使用 window[movieName]document[movieName]
  • 我有一个 flashReady() JS 函数,一旦加载,它就会从 swf 中调用。反过来,它尝试通过从 getSWF() 获取正确的对象来进行初始化。据我所知,window[movieName] 得到 标签,document[movieName] 得到 标签。您建议为哪个浏览器使用 getElementById?
  • @OctoRazor 所有这些,window[movieName] 是 IE 的一个旧功能,用于通过他的 ID 获取元素。 document.getElementById 现在是通过他的 id 访问元素的标准方式。它适用于所有浏览器,除非您使用超过 14 年的浏览器(例如:IE4)。

标签: javascript flash actionscript internet-explorer-9 externalinterface


【解决方案1】:

我在 IE9 上也遇到过同样的问题,对我来说,这是 IE9 缓存闪存的情况。尝试清除浏览器缓存(开发者工具为 f12,我认为有一个清除缓存的图标或 ctrl-R),然后再试一次。

如果没有,请尝试通过将您的 javascript 调用延迟 1 或 2 秒来进行调试,类似于以下内容:

<SCRIPT LANGUAGE='Javascript'>

function delayForFlash() {
setTimeout("startFlash()", 1000);
}

function startFlash() {
getFlashMovie("flashdemo").restartFlash();
}

window.onload = function(){ delayForFlash();}
</SCRIPT>

这是为了给您的闪存足够的时间来加载所有内容。

【讨论】:

  • 感谢您的提示,但事实并非如此。我确切地知道电影何时准备就绪,因为我从电影本身触发了 JS 初始化过程。无论如何,出于好奇,我尝试添加延迟,但没有奏效。
  • 所以你的代码工作方式是:ActionScript 调用 Javascript,然后 Javascript 将一些信息传递回 Actionscript?我曾经这样做过,但后来我切换到等待 Flash 加载,并且由于一些 IE9 缓存问题,javascript 首次与 actionscript 联系。您是在本地运行还是在服务器上运行时遇到此问题?
  • 服务器和本地都有问题。即使等待几分钟后也无法调用该函数(我知道,很傻)。您可以使用开发工具控制台对此进行测试。我针对我的问题发布了一个新的解决方案。它是脏的,并且依赖于特定的 AS 函数来让 JS 验证其可用性。
【解决方案2】:

我遇到过类似的问题,只是它在 IE9 中运行,而不是在 IE7/8 中运行。我相信我们两个问题的原因是一样的。我通过偶然发现 A List 上的这篇精彩文章解决了这个问题:Apart http://www.alistapart.com/articles/flashsatay/

在文章之后,您正确格式的 HTML 应为:

<object type="application/x-shockwave-flash" data="/swf/movie.swf" width="1" height="1" id="MyMovie">
    <param name="allowScriptAccess" value="always" />
    <param name="movie" value="/swf/movie.swf" />
    <param name="quality" value="high" />
    <param name="bgcolor" value="#ffcc00" />
</object>

特别注意我添加了type 并删除了&lt;embed&gt; 标签。

据我所知,没有必要再使用&lt;embed&gt; 标签了。删除它意味着我们可以使用更简单的代码来触发 ExternalInterface 函数:

// After the flash object has loaded...
var movie = document.getElementById('MyMovie');
if (typeof movie.MyExternalFunction === 'function') movie.MyExternalFunction();

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 2018-04-29
    • 2012-02-09
    • 2012-08-02
    • 2014-05-04
    • 2011-07-29
    • 2015-10-08
    相关资源
    最近更新 更多