通过Javascript访问ActionScript函数

时间:2011-06-01 22:39:14

标签: javascript actionscript externalinterface nomethoderror

我正在尝试使用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!";
        }
    }
}

注意:如果重要的话,我正在使用flex mxmlc编译器将其编译为swf。

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文件未加载的情况下添加超时,但我也没有使用该方法取得任何成功。

有什么想法吗?

干杯,
麦克

2 个答案:

答案 0 :(得分:5)

我明白了。通过ExternalInterface.call发出javascipt信号的关键方法,以便我们确定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>

答案 1 :(得分:2)

我认为问题在于闪存没有被加载。我使用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>  

这有帮助吗?