javascript - 如何让javascript与flash通信(对象#<HTMLObjectElement>没有方法

标签 javascript actionscript-3 flash swfobject externalinterface

我正在尝试从 javascript 向 flash 发送一条简单的测试消息,但出现错误:

Object #<HTMLObjectElement> has no method "listenToJS"

我已经在堆栈上阅读了许多有关此问题的问题,但我觉得浏览器没有获得对我的 Flash 对象的正确引用,或者在我的 ActionScript 中我没有将 Flash 函数放在正确的位置。

所以在 html 中我使用 SWFObj 嵌入 flash:

<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文件使用文档类,文档类中是公共(public)函数。 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);
            }
     }
}

---更新---

出于某种原因,外部接口(interface)似乎不喜欢 SWFObject。如果我切换到 Flash 在本例中使用的嵌入方法:

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

它可以工作,但我觉得 swfobject 是嵌入 flash 的最佳方式。有人有什么想法吗?

最佳答案

如果您在 html 中嵌入 flash 作为上面的代码,请注意,第二个标记 object 还必须包含属性 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 是嵌入 flash 的最佳方式。正确的 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>

--更新--

您必须在页面上选择正确的 Flash 元素。 (取决于浏览器)。作为示例,以下是获取正确 flashObj 的代码:

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

关于javascript - 如何让javascript与flash通信(对象#<HTMLObjectElement>没有方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14345936/

相关文章:

javascript - abc.filter().map() ==> to reduce() 应该怎么用呢? JavaScript

javascript - ReactJS - 组件 - 最佳实践

html - 禁用 Shockwave 播放器中的暂停按钮

ios - 无法在 Windows 8.1 上枚举设备错误

javascript - 无法读取未定义的属性 'hue'

javascript - node.js 将变量公开给模块?

actionscript-3 - ActionScript drawRoundRect 渲染角半径不一致

arrays - 通过从as3中的库文件制作数组来播放声音?

iphone - 在 AIR/AS3 中使用特定于移动设备的类测试代码时,如何避免出现VerifyError?

java - 将 Java2D 保存到 SWF (flash)