AS3 ExternalInterface适用于IE,但不适用于Firefox

时间:2011-01-07 23:46:25

标签: actionscript-3 firefox externalinterface

我正在尝试使用ExternalInterface从我的javascript执行AS3功能。似乎在IE中工作正常,但firefox总是返回javascript错误方法undefined。

我多年来一直在Google上搜索,并消除了以下可能性:

1)有些人说你需要在你的对象标签里面加一个embed标签,所以加了一个 - 没有运气。

2)很多人说你需要在调用javascript之前确保你的flash已加载。好吧,我的电话是在按下页面上的链接后。我总是先使用闪存应用程序,最后只按下链接。

3)然后我认为这可能是一个安全问题,所以添加了以下内容:

try {
    ExternalInterface.addCallback("test", testing);
    trace("added callback"); 
}
catch (error:SecurityError) {
    trace("Security Error:"+error.message); 
}
catch (error:Error) {
   trace("Error:"+error.message); 
} 

但是它打印出了#34;添加了回调" :(

其他人有任何想法我还能尝试什么吗?我正在运行最新的Firefox和FlashPlayer 10。

此致

奥利

2 个答案:

答案 0 :(得分:3)

想出来。你需要为IE使用object标签,为FF使用embed标签。还没有测试过其他浏览器,但希望embed标签也能用于它们。

帮助其他人解决同样的问题。这是一个适合我的HTML页面:)

此致

奥利

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
    <head>
        <title>test</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <style type="text/css" media="screen">
        html, body { height:100%; background-color: #ffffff;}
        body { margin:0; padding:0; overflow:hidden; }
        #flashContent { width:100%; height:100%; }
        </style>
    </head>
    <script>
        function testIt(){
            var flashContainer;
             if(navigator.appName.indexOf("Microsoft") != -1){
                  flashContainer = document.getElementById("test");
             }else{
                  flashContainer = document.getElementById("test-embedded");
             }
            flashContainer.test("js says hello");
        }  
    </script>
    <body>
        <a href="#" onclick="testIt();">Press here</a>
        <div id="flashContent">
            <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" id="test" align="middle" width="550" height="400">
                <param name="movie" value="test.swf" />
                <param name="quality" value="high" />
                <param name="bgcolor" value="#ffffff" />
                <param name="play" value="true" />
                <param name="loop" value="true" />
                <param name="wmode" value="transparent" />
                <param name="scale" value="showall" />
                <param name="menu" value="true" />
                <param name="devicefont" value="false" />
                <param name="salign" value="" />
                <param name="allowScriptAccess" value="sameDomain" />
                <embed src='test.swf' height='400' width='550' id='test-embedded' PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer"></embed>
            </object>
    </body>
</html>

答案 1 :(得分:2)

如果你的flash在Firefox中运行正常,我们可以放心地认为HTML包装器或尝试调用该函数的JavaScript代码有问题。发布这些内容会有很大帮助。

但是,一般来说,IE将使用<object>标记,其他人都将使用<embed>标记。我认为最好的想法是使用jQuery进行flash嵌入和调用,这里是我碰巧使用的简单HTML代码,适用于IE,Firefox和Chrome:

<object id="GAMENAME" classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'
    codebase='http://download.adobe.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0'>
    <param name="allowScriptAccess" value="always">
    <param name="movie" value="game.swf">

    <embed id="GAMENAME" name="GAMENAME" src="game.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash"
        allowScriptAccess="always">
    </embed>
</object>

我有一个实用程序函数来访问flash对象:

function getGame()
{
    if (window.document[gameName])
    {
        return window.document[gameName];
    }
    if (navigator.appName.indexOf('Microsoft Internet') == -1)
    {
        if (document.embeds && document.embeds[gameName])
        {
            return document.embeds[gameName];
        }
        else
        {
            return document.getElementById(gameName);
        }
    }
}

是的,它需要将全局变量gameName设置为为flash对象指定的名称。在我们的例子中,它必须是"GAMENAME"才能与上面的HTML相对应。我提到这不是我考虑的生产代码吗?

然后调用我使用的Flash对象:

getGame().test()

这里的JavaScript可能不是完全合理的或者代表最佳实践,但它确实指出了在<object><embed>存在的情况下找到嵌入式Flash对象时遇到的问题。多个浏览器。