2

在过去的几个小时里,我一直在为此苦苦挣扎,我真的不知道可能出了什么问题。我只是想让 Javascript 与 Flash 进行文本通信。我用这个来源找到了这个很好的例子

http://blog.circlecube.com/wp-content/uploads/2008/02/ActionscriptJavascriptCommunication.zip

我在本地运行了 html 文件,它可以很好地从 Flash 发送和检索文本。然后我将相同的示例加载到我的开发谷歌应用服务器中,我无法将文本从 javascript 发送到 flash。奇怪的是,虽然 flash 能够发送 Javascript 文本。任何人都可以看看他们是否可以使用 GAE 运行它吗?太感谢了!

4

3 回答 3

2

它可能与谷歌应用引擎本身无关,因为整个事情都在浏览器中运行——除非在你没有提到的地方存在某种服务器依赖。假设情况并非如此......

如果您能够让 Flash 使用 ExternalInterface.call() 调用 JavaScript,但不能让 JavaScript 回调 Flash,那么可能是一两件事:您的 EI 回调和处理程序未正确连接(在 Flash 中) ),或者您的 JavaScript 在浏览器中没有 SWF 对象的句柄。

您可能会尝试发布一些代码,但与此同时,我知道这在 IE 和 FireFox 中都有效。一、浏览器代码:

<html>
<head>
<script language="JavaScript" type="text/javascript">

    var swfReady = false;

    function callbacksInitialized()
    {
        swfReady = true;
    }

    function helloFlash()
    {
        if (swfReady)
        {   
            // Get a handle on the Flash object
            var swfObject = navigator.appName.indexOf("Microsoft") != -1 ? window["HelloMac"] : document["HelloMac"] ;

            // Call back into the Flash file 
            swfObject.helloFlash(document.getElementById("txtMessage").value);
        }
    }

    function helloMac(message)
    {
        alert(message);
    }

</script>
</head>
<body scroll="no">
    <div align="center">

        <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
                id="HelloMac" width="600" height="300"
                codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab">
                <param name="movie" value="HelloMac.swf" />
                <param name="quality" value="high" />
                <param name="bgcolor" value="#869ca7" />
                <param name="allowScriptAccess" value="sameDomain" />
                <embed src="HelloMac.swf" quality="high" bgcolor="#869ca7"
                    width="600" height="300" name="HelloMac" align="middle"
                    play="true"
                    loop="false"
                    quality="high"
                    allowScriptAccess="sameDomain"
                    type="application/x-shockwave-flash"
                    pluginspage="http://www.adobe.com/go/getflashplayer">
                </embed>
        </object>

        <br /><br />
        <input type="text" id="txtMessage" value="Hello, Flash!" /><br />
        <input id="btnSend" type="button" value="Send to Flash" onclick="helloFlash();" />
    </div>
</body>
</html>

现在,Flash 代码(在我的例子中,它是 Flex,所以希望它很清楚):

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="init()" height="300" width="600">

    <mx:Script>
        <![CDATA[

            import mx.controls.Alert;
            import flash.external.ExternalInterface;

            private function init():void
            {
                addCallbacks(); 
            }

            private function addCallbacks():void
            {
                ExternalInterface.addCallback("helloFlash", this_helloFlash);
                ExternalInterface.call("callbacksInitialized");
            }

            // Display a message from the host
            private function this_helloFlash(message:String):void
            {
                Alert.show(message);
            }

            // Send a string to the host
            private function helloMac():void
            {
                if (ExternalInterface.available)
                {
                    ExternalInterface.call("helloMac", txtMessage.text);
                }
            }

        ]]>
    </mx:Script>

    <mx:VBox horizontalCenter="0" verticalCenter="0">
        <mx:TextInput id="txtMessage" text="Hello, Mac!" />
        <mx:Button id="btnSend" label="Send to Host" click="helloMac()" />
    </mx:VBox>

</mx:Application>

该示例演示了 Flash 调用带有一些文本的 JavaScript,以及 JavaScript 以相同的方式回调 Flash。需要注意的几点:

  • 确保您等待调用 Flash,直到 Flash 通知浏览器它已准备好开始接收调用(如我的 callbacksInitialized() 方法所示)。
  • 测试以确保您使用的是适当的特定于浏览器的对象引用(例如,window["HelloMac"] 与 document["HelloMac"])。

在不知道更多的情况下,我猜它是这两个项目之一,因为这是我的经验。希望能帮助到你!如果您有任何后续,我会密切关注该帖子。

于 2009-01-23T07:23:46.880 回答
1

我没有在您的代码中看到对 allowDomain 函数的调用。没有安全沙箱将不允许您的闪存应用程序与服务器上的闪存通信,反之亦然。System.security.allowDomain("mydomain.com", "mySecondDomain.com", "etc.com")为将执行 Flash 应用程序的每个域添加一个调用。此外,嵌入代码还需要通过包含参数来指定 JavaScript 的访问权限<param name="allowScriptAccess" value="always" />

于 2009-01-28T05:23:11.310 回答
0

是的,Christian Nunciato 的回答很有帮助。问题是您的 swf 文件在您的 javascript 调用 flash 函数时对 javascript 不可用。Christian 的技巧确保 swf 文件在您的 javascript 需要时加载并启动。

于 2009-01-23T17:07:12.413 回答