Javascript AdobeExternalInterface在IE9中不工作

Javascript AdobeExternalInterface在IE9中不工作,javascript,flash,actionscript,internet-explorer-9,externalinterface,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(); } f

我正在从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>
在IE9中,我得到一个JS错误:

"Object doesn't support property or method 'MyExternalFunction'" 
显然,对IE有好处的window[movieName],在IE9中已经不像以前那样工作了。 有什么建议吗

::更新::

这是我目前的解决方案。它可能看起来不漂亮,但它可以工作:

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);
}

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

如果没有,请尝试通过将对actionscript的javascript调用延迟1或2秒进行调试,大致如下:

<SCRIPT LANGUAGE='Javascript'>

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

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

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

函数delayForFlash(){
setTimeout(“startFlash()”,1000);
}
函数startFlash(){
getFlashMovie(“flashdemo”).restartFlash();
}
window.onload=函数(){delayForFlash();}

这是为了给你的闪光灯足够的时间来加载所有东西

我也遇到过类似的问题,只是它在IE9中工作,而不是在IE7/8中。我相信我们两个问题的原因是一样的。我在一张单子上偶然看到了这篇精彩的文章,解决了这个问题:分开

在本文之后,正确格式的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=“text/javascript”,但这不重要。您何时调用外部函数?调用Flash对象时可能没有加载它。另外,我们不是在1990年,
document.getElementById
可以在所有浏览器上工作,不要使用
window[movieName]
document[movieName]
。我有一个flashReady()JS函数,一旦加载就从swf调用。反过来,它尝试通过从getSWF()获取正确的对象来初始化。到我的知识窗口[movieName]获取标记,文档[movieName]获取标记。你建议哪个浏览器使用getElementById?@OctoRazor所有这些,
窗口[movieName]
都是IE的一个老功能,用于通过ID获取元素。
文档。getElementById
现在是通过ID访问元素的标准方式。它适用于所有浏览器,除非你使用的是14年以上的浏览器(例如:IE4)。谢谢你的提示,但不是这个。我确切地知道电影什么时候准备好了,因为我从电影本身触发JS init进程。在任何情况下,出于好奇,我尝试添加延迟,但没有成功。因此,您的代码的工作方式是:ActionScript调用Javascript,然后Javascript将一些信息传递回ActionScript?我曾经这样做过,但后来我切换到等待flash加载,javascript第一次接触到actionscript,因为一些IE9缓存问题。您是在本地运行还是在服务器上运行时遇到此问题?服务器和本地都存在此问题。即使等待了几分钟也无法调用该函数(我知道,傻瓜)。您可以使用开发工具控制台来测试这一点。我发布了一个新的问题解决方案。它是脏的,并且依赖于一个特定的AS函数,以便JS验证其可用性。
function flashReady() // This is called from ActionScript
{
    if(initSwf("MyMovie")) {
        movie.MyExternalFunction();
    } else {
        alert("Failed to initialize");
    }
}
<SCRIPT LANGUAGE='Javascript'>

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

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

window.onload = function(){ delayForFlash();}
</SCRIPT>
<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>
// After the flash object has loaded...
var movie = document.getElementById('MyMovie');
if (typeof movie.MyExternalFunction === 'function') movie.MyExternalFunction();