2

私は過去数時間これに苦労してきましたが、何が問題なのか本当にわかりません. 私は単に Javascript を取得してテキストを Flash と通信させようとしています。このソースでこの素晴らしい例を見つけました

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

私はhtmlファイルをローカルで実行しましたが、フラッシュからテキストを送信および取得するのに問題なく動作します。次に、まったく同じサンプルを dev Google アプリ サーバーにロードすると、JavaScript からフラッシュにテキストを送信できません。奇妙なことに、Flash は Javascript テキストを送信できます。これを GAE で実行できるかどうか、誰にもわかりますか? どうもありがとう!

4

3 に答える 3

2

すべてがブラウザで実行されているため、おそらくGoogleアプリエンジン自体とは関係ありません-あなたが言及していないサーバー依存関係がどこかにない限り. そうでないと仮定すると…

ExternalInterface.call() を使用して Flash を JavaScript に呼び出すことができるが、JavaScript に Flash にコールバックさせることができない場合は、おそらく 1 つまたは 2 つの原因があります: 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"] など) を使用していることを確認してください。

詳細はわかりませんが、私の経験から、この 2 つの項目のいずれかであると推測しています。それが役に立てば幸い!フォローアップがある場合に備えて、投稿を監視します。

于 2009-01-23T07:23:46.880 に答える
1

コードにallowDomain関数の呼び出しが表示されません。それがないと、セキュリティサンドボックスはフラッシュアプ​​リケーションがサーバー上でフラッシュと通信したり、その逆を行ったりすることを許可しません。System.security.allowDomain("mydomain.com", "mySecondDomain.com", "etc.com")フラッシュアプ​​リが実行されるすべてのドメインに呼び出しを追加します。また、埋め込みコードは、パラメーターを含めることによってJavaScriptへのアクセスを指定する必要もあります<param name="allowScriptAccess" value="always" />

于 2009-01-28T05:23:11.310 に答える
0

はい、クリスチャン・ヌンシアトの答えは役に立ちます。問題は、javascript が flash 関数を呼び出すときに、swf ファイルが javascript で使用できないことです。Christian のトリックにより、swf ファイルが読み込まれ、javascript が必要なときに開始されるようになります。

于 2009-01-23T17:07:12.413 に答える