AS3 ExternalInterface работает в IE, но не в Firefox - PullRequest
2 голосов
/ 08 января 2011

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

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

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

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.

С уважением,

Олли

Ответы [ 2 ]

3 голосов
/ 09 января 2011

Разобрался. Вам нужно использовать тег объекта для 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>
2 голосов
/ 08 января 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> и нескольких браузеров.

...