AS3 ExternalInterface работает в IE, но не в Firefox.

Я пытаюсь выполнить функцию AS3 из своего javascript, используя ExternalInterface. Кажется, работает нормально в IE, но firefox всегда возвращает метод ошибки javascript undefined.

Я гуглил это целую вечность и устранил следующие возможности:

1) Некоторые люди говорят, что вам нужно иметь тег embed внутри тега объекта, поэтому добавили его - не повезло.

2) Многие говорят, что вам нужно убедиться, что ваша флеш-память загружена, прежде чем вызывать javascript. Я звоню после нажатия ссылки на странице. Я всегда сначала использую флеш-приложение и нажимаю только ссылку в конце.

3) Тогда я подумал, что, возможно, это проблема безопасности, поэтому добавил следующее:

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

Но он выводит "добавленный обратный вызов" :(

У кого-нибудь еще есть идеи, что еще я могу попробовать? Я использую последнюю версию Firefox и FlashPlayer 10.

С уважением,

Олли


person user567602    schedule 07.01.2011    source источник
comment
похоже, что это проблема JavaScript, а не Flash, а это означает, что, вероятно, ошибка связана с вашим JS-кодом. Вы использовали консоль FireBug? Возможно, разместите свой код?   -  person goliatone    schedule 08.01.2011


Ответы (2)


Догадаться. Вам нужно использовать тег объекта для IE и встроенный тег для FF. Еще не тестировал с другими браузерами, но, надеюсь, тег 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>
person user567602    schedule 08.01.2011

Если в остальном ваша флеш-память работает нормально в Firefox, мы можем с уверенностью предположить, что что-то не так с HTML-оболочкой или кодом JavaScript, который пытается вызвать функцию. Размещение этих произведений может значительно помочь.

Но, вообще говоря, IE будет использовать тег <object>, а все остальные будут использовать тег <embed>. Я думаю, что лучше всего использовать jQuery для встраивания и вызова флэш-памяти, вот простой 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>

У меня есть служебная функция для доступа к флеш-объекту:

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 было установлено имя, данное флэш-объекту. В нашем случае это должно быть "GAMENAME", чтобы соответствовать приведенному выше HTML. Я упоминал, что это не то, что я считаю производственным кодом?

Затем для вызова Flash-объекта я использую что-то вроде:

getGame().test()

Приведенный здесь JavaScript может быть не совсем разумным или иным образом отражать передовой опыт, но он указывает на проблему, возникающую при нахождении встроенного объекта Flash при наличии <object> против <embed> и нескольких браузеров.

person George Phillips    schedule 08.01.2011