1

JavaScriptからフラッシュに簡単なテストメッセージを送信しようとしていますが、エラーが発生します:

Object #<HTMLObjectElement> has no method "listenToJS"

スタックでこれに関するいくつかの質問を読みましたが、ブラウザーがフラッシュオブジェクトへの適切な参照を取得していないか、アクションスクリプト内でフラッシュ機能を適切な場所に配置していないように感じます。

したがって、html内にSWFObjを使用してフラッシュを埋め込みます。

<div id="flash_content">
    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="1280" height="800" id="tourFlash" name="pano" class="pano">
        <param name="movie" value="VRDemo.swf" />
        <param name="menu" value="false" />
        <param name="wmode" value="transparent" />
        <param name="allowscriptaccess" value="always" />
        <!--[if !IE]>-->
        <object type="application/x-shockwave-flash" data="VRDemo.swf" width="1280" height="800" class="pano">
            <param name="menu" value="false" />
            <param name="wmode" value="transparent" />
            <param name="allowscriptaccess" value="always" />
            <param name="allownetworking" value="all" />
            <param name="flashvars" value="zoom=null&amp;pan=null&amp;sound=null" />
        <!--<![endif]-->
            <a href="http://www.adobe.com/go/getflashplayer">
                <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" />
            </a>
        <!--[if !IE]>-->
        </object>
        <!--<![endif]-->
    </object>
</div>

<script>

var flashObj; 

$(document).ready(function(){

    flashObj = document.getElementById('tourFlash');

    $('#interface').click(function(){
        console.log('click');
        talkToFlash();
    });
});

function talkToFlash(){
    flashObj.listenToJS('hello from js');
}

function listenFromFlash(flashMessage){
    console.log(message);
}
</script>

クリックハンドラーがトリガーされますが、ここでエラーが発生します。私のフラッシュファイルはドキュメントクラスを使用しており、ドキュメントクラス内にはパブリック関数があります。Flashは次のように構成されています。

package com.company.vr {

    import flash.display.*;
    import flash.events.*; 
    import com.greensock.*;
    import com.greensock.easing.*;
    import flash.external.ExternalInterface;
    import flash.system.Security;

    Security.allowDomain("*");

     public class VR_TestDocument extends MovieClip {
            public function VR_TestDocument() {
              ExternalInterface.addCallback("talkToFlash", listenToJS);
            }


            public function listenToJS(message){
              trace ("from js: " + message);
              var flashMessage = message + " flash";
              ExternalInterface.call("listenFromFlash", flashMessage);
            }
     }
}

- -アップデート - -

外部インターフェースが何らかの理由でSWFObjectを好まないようです。この例でFlashが使用した埋め込み方法に切り替えると、次のようになります。

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/external/ExternalInterface.html#addCallback()

動作しますが、フラッシュを埋め込むにはswfobjectが最適な方法だと思います。誰かアイデアがありますか?

4

2 に答える 2

1

上記のコードのように html にフラッシュを埋め込んだ場合、2 番目のタグオブジェクトにも属性idを含める必要があることに注意してください。修正されたコードは次のとおりです。

<div id="flash_content">
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="1280" height="800" id="tourFlash" name="pano" class="pano">
    <param name="movie" value="VRDemo.swf" />
    <param name="menu" value="false" />
    <param name="wmode" value="transparent" />
    <param name="allowscriptaccess" value="always" />
    <!--[if !IE]>-->
    <object type="application/x-shockwave-flash" data="VRDemo.swf" width="1280" height="800" class="pano" id="tourFlash1">
        <param name="menu" value="false" />
        <param name="wmode" value="transparent" />
        <param name="allowscriptaccess" value="always" />
        <param name="allownetworking" value="all" />
        <param name="flashvars" value="zoom=null&amp;pan=null&amp;sound=null" />
    <!--<![endif]-->
        <a href="http://www.adobe.com/go/getflashplayer">
            <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" />
        </a>
    <!--[if !IE]>-->
    </object>
    <!--<![endif]-->
</object>

もちろん、swfobject はフラッシュを埋め込むための最良の方法です。正しい html コードは次のようになります。

    <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
    <head>
        <title>js</title>       
        <script type="text/javascript" src="swfobject.js"></script>
        <script>
            function talkToFlash(){
                document.getElementById('flash_content').listenToJS('hello from js');
            }

            var flashvars =  {};
            var params = {
                allowscriptaccess: "always"         
            }           
            var attributes =  {};
            swfobject.embedSWF("VRDemo.swf", "flash_content", "550", "400", "10.0.0", false, flashvars, params, attributes);
    </script>   
    </head>
    <body>
        <div id="flash_content"></div>
    </body>
</html>

- アップデート -

ページで正しいフラッシュ要素を選択する必要があります。(ブラウザによって異なります)。例として、正しい flashObj を取得するコードを次に示します。

flashObj1 = document.getElementById('tourFlash');
flashObj2 = document.getElementById('tourFlash1');
flashObj = flashObj1.talkToFlash != undefined ? flashObj1 : flashObj2;      
于 2013-01-16T11:11:37.143 に答える
0

これはタイミングの問題である可能性が非常に高く、Flash Player は ExternalInterface を初期化するのに少し時間がかかり、その後 SWF をロードするのに少し時間がかかります。サンプル コードは DOMReady で実行されています。これは、SWF が読み込まれたこと、または ExternalInterface が Flash Player 内で初期化されたことを保証するものではありません。

SWF にクエリを実行して、読み込みが完了したかどうかを確認することをお勧めします。LearnSWFObject.com に (動的公開を使用した) 例があります: http://learnswfobject.com/advanced-topics/executing-javascript-when-the-swf-has-finished-loading/

更新: コードとその他の提案された回答を読み直した後document.getElementById<object>. ネストされた<object>マークアップを使用する場合、これは機能しません (outer を使用する IE を除く<object>)。swfobject.getObjectByIdこの問題に対処するために特別に作成されました。JS を編集して使用してみてくださいswfobject.getObjectById

于 2013-01-16T01:00:13.657 に答える