Adobe ExternalInterface无法在IE9中运行

时间:2011-07-20 13:56:37

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

我从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'" 

显然窗口[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");
    }
}

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我一直遇到类似的问题,除了它在IE9而不是IE7 / 8中工作。我相信我们两个问题的原因是相同的。我通过绊倒A List上的这篇精彩文章解决了它:分开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并删除了<embed>代码。

据我所知,无需再使用<embed>标记。删除它意味着我们可以使用更简单的代码来激发我们的ExternalInterface函数:

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

我希望这会有所帮助。