简体   繁体   English

如何允许javascript与Flash通信(对象# <HTMLObjectElement> 没有办法

[英]how to allow javascript to communicate with flash (Object #<HTMLObjectElement> has no method

I'm trying to send a simple test message from javascript to flash, but I'm getting the error: 我正在尝试从javascript向Flash发送简单的测试消息,但出现错误:

Object #<HTMLObjectElement> has no method "listenToJS"

I've read a number of questions on this on stack, but I feel like either the browser is not getting the proper reference to my flash object, or within my actionscript I am not putting my flash function in the proper place. 我已经阅读了很多有关此问题的问题,但是我觉得浏览器没有正确引用我的Flash对象,或者在我的动作脚本中我没有将Flash函数放在适当的位置。

So within html I am embedding flash with SWFObj: 因此,在html中,我将Flash嵌入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>

The click handler is triggered, but here I get the error. 单击处理程序被触发,但是在这里我得到了错误。 My flash file uses a document class, and within the document class is the public function. 我的Flash文件使用文档类,并且在文档类中是public函数。 Flash is structured like this: 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);
            }
     }
}

---UPDATE--- --- UPDATE ---

It looks like External Interface doesn't like SWFObject for some reason. 出于某种原因,看来外部接口不喜欢SWFObject。 If I switch to the method of embedding that Flash used in this example: 如果我切换到此示例中使用的嵌入Flash的方法:

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

it works, but I feel like swfobject is the best way to embed flash. 它可以工作,但是我觉得swfobject是嵌入Flash的最佳方法。 Anyone got any ideas? 任何人有任何想法吗?

If you embeded flash in html as your code above, note, that second tag object also has to contain attribute id , corrected code is here: 如果您将Flash嵌入html作为上面的代码,请注意,第二个标签对象还必须包含属性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>

But of course, swfobject is the best way to embed flash. 但是,当然,swfobject是嵌入Flash的最佳方法。 Correct html code looks like: 正确的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>

--Update-- --Update--

You have to select the correct flash element on the page. 您必须在页面上选择正确的Flash元素。 (Depends on the browser). (取决于浏览器)。 As an example, here is code to get correct flashObj: 例如,下面是获取正确的flashObj的代码:

flashObj1 = document.getElementById('tourFlash');
flashObj2 = document.getElementById('tourFlash1');
flashObj = flashObj1.talkToFlash != undefined ? flashObj1 : flashObj2;      

It could very well be a timing issue -- Flash Player takes a little bit of time to initialize ExternalInterface, and then a little bit more time to load your SWF. 这很可能是时间问题– Flash Player花费一点时间来初始化ExternalInterface,然后花费更多时间来加载SWF。 Your example code is running on DOMReady, which is NOT a guarantee that the SWF has loaded or that ExternalInterface has initialized within Flash Player. 您的示例代码在DOMReady上运行,这不保证SWF已加载或Flash Player中已初始化ExternalInterface。

I recommend querying the SWF to see if it has finished loading. 我建议查询SWF以查看其是否已完成加载。 There's an example (using dynamic publishing) on LearnSWFObject.com: http://learnswfobject.com/advanced-topics/executing-javascript-when-the-swf-has-finished-loading/ 在LearnSWFObject.com上有一个示例(使用动态发布): http ://learnswfobject.com/advanced-topics/executing-javascript-when-the-swf-has-finished-loading/

UPDATE: After re-reading your code and some other suggested answers, I noticed you're using document.getElementById to grab your <object> . 更新:重新阅读代码和其他一些建议的答案后,我注意到您正在使用document.getElementById来获取您的<object> When using the nested <object> markup, this won't work (except in IE, which uses the outer <object> ). 当使用嵌套的<object>标记时,这将不起作用(IE中除外,后者使用外部的<object> )。 swfobject.getObjectById was specifically created to address this issue. swfobject.getObjectById是专门为解决此问题而创建的。 Try editing your JS to use swfobject.getObjectById . 尝试编辑您的JS以使用swfobject.getObjectById

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM