Доступ к функции ActionScript через Javascript

Я пытаюсь вызвать функцию в сценарии действия, используя ExternalInterface.addCallback API, но не могу заставить ее работать. Вот что у меня есть:

ActionScript:

//MyClass.as  
package {

    import flash.display.Sprite;
    import flash.external.ExternalInterface;

    public class MyClass extends Sprite
    {
        public function MyClass()
        {
            ExternalInterface.addCallback('getStringJS', getStringAS);
        }

        public function getStringAS():String
        {
            return "Hello World!";
        }
    }
}

ПРИМЕЧАНИЕ. Я компилирую это в SWF-файл с помощью компилятора flex mxmlc, если это имеет значение.

HTML / Javascript:

<!doctype html>
<html>
    <head>
        <title>User Identification</title>
    <head>
    <body>
        <object id="MyClass" name="MyClass" type="application/x-shockwave-flash" data="MyClass.swf" width="1" height="1">
            <param name="movie" value="MyClass.swf">
            <embed src="MyClass.swf" width="1" height="1">
        </object>
        <script type="text/javascript">
            var flash = document.getElementById("MyClass");
            var str = flash.getStringJS();
            alert(str);
        </script>
    </body>
</html>

Я получаю следующее сообщение об ошибке:

Uncaught TypeError: Object #<HTMLObjectElement> has no method 'getStringJS'

Я также попытался добавить тайм-аут на случай, если файл swf не загружается, но и с этим методом у меня ничего не вышло.

Есть предположения?

Приветствую,
Майк


person Swift    schedule 01.06.2011    source источник


Ответы (2)


Я понял. Ключевой способ сигнализировать javascipt через ExternalInterface.call, чтобы мы точно знали, что swf загружен. Самый «универсальный» способ сделать это:

MyClass.as

//MyClass.as  
package {

    import flash.display.Sprite;
    import flash.external.ExternalInterface;

    public class MyClass extends Sprite
    {
        public function MyClass()
        {
            ExternalInterface.addCallback('getStringJS', getStringAS);
            if  (ExternalInterface.available) {
                ExternalInterface.call("isConnectedFlex");
            }
        }

        public function getStringAS():String
        {
            return "Hello World!";
        }
    }
}

index.html

<!doctype html>
<html>
    <head>
        <title>User Identification</title>
    <head>
    <body>
        <object id="MyClass" name="MyClass" type="application/x-shockwave-flash" data="MyClass.swf" width="1" height="1">
            <param name="movie" value="MyClass.swf">
            <embed src="MyClass.swf" width="1" height="1">
        </object>
        <script type="text/javascript">

            var flash = document.getElementById("MyClass");

            function isConnectedFlex() {
                var str = flash.getStringJS();
                alert(str);
            }


        </script>
    </body>
</html>
person Swift    schedule 01.06.2011
comment
Хороший пример. Работает по-прежнему в 2017 году. Для других здесь также можно найти дополнительную информацию: help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/ - person Aleks; 09.02.2017

Думаю, проблема в том, что не загружается флешка. Я пробовал ваш код, используя событие window.onload, и у меня это сработало:

Вспышка такая же ...

HTML / JS:

<!doctype html>
<html>
    <head>
        <title>User Identification</title>
    <head>
    <body>

        <object id="MyClass" name="MyClass" type="application/x-shockwave-flash" data="MyClass.swf" width="1" height="1">
            <param name="movie" value="MyClass.swf">
            <embed src="MyClass.swf" width="1" height="1">
        </object>

        <script>

            window.onload = function() {

                var flash = document.getElementById("MyClass");
                var test = flash.getStringJS("test");
                alert(test);   //pops up with "Hello World!" on Firefox

            };

        </script>
    </body>
</html>  

Это помогает?

person Ian    schedule 01.06.2011
comment
Да, это заставило меня понять, что мне действительно нужно научиться проверять свою работу в других браузерах, ха-ха. Он работает в Firefox и IE, но не в Chrome. В любом случае мне нужен более универсальный метод. Есть предположения? - person Swift; 02.06.2011
comment
Я понимаю. Возможно, вы захотите проверить эту ссылку: проблема-доступ-внешний-интерфейс-открытый -method-in-google-chrome - person Ian; 02.06.2011