【问题标题】:How to call flash actionscript callback method from javascript?如何从 javascript 调用 flash actionscript 回调方法?
【发布时间】:2011-12-01 06:03:22
【问题描述】:

我尝试从 JavaScript 调用 flash 回调方法。 但它似乎不起作用。 flash动作脚本示例代码如下[简化]:

import flash.events.ActivityEvent; 
import flash.events.StatusEvent; 
import flash.external.ExternalInterface;

var test_var = ExternalInterface.addCallback("js_method_to_call", flash_method);


function flash_method()
{   
  return "test"; 
}

javascript示例代码如下[简体]:

 function callFlashMethod(){
   var flashFile = eval("window.document.test");
   flashFile.js_method_to_call;
 }
 function loadTest(){
   swfobject.embedSWF("test.swf", "test", "1", "1", "10.0.0", false);
 }

 $(document).ready(function(){
   loadTest();
   callFlashMethod();
 });

fire bug 控制台总是显示错误“flashFile.js_method_to_call is not a function”。

【问题讨论】:

  • 你试过用 window[ 'test' ] 代替 eval 吗?我很确定这就是问题所在。

标签: javascript jquery flash actionscript-3 swfobject


【解决方案1】:

我不确定这条线:

var flashFile = eval("window.document.test");

我会使用:

var flashFile = document.getElementById("test");

另外,我猜这只是粘贴到这里时的一个错字,但flashFile.js_method_to_call; 应该是flashFile.js_method_to_call();

【讨论】:

  • 我已经尝试了以下所有 3 个选项,但似乎不起作用。 document.getElementById("test")$("#test")eval("window.document.test")
【解决方案2】:

这里有一些应该很好用的东西:

  1. 使用 SWFObject.js 嵌入 Flash 内容:

    // Embedding through SWFObject rocks in comparison with Adobe shits:
    var flashvars = {};
    
    var params                  =   {};
    params.menu                 =   "false";
    params.salign               =   "t";
    params.scale                =   "noscale";
    params.wmode                =   "transparent";
    params.allowScriptAccess    =   "always";
    
    var attributes              =   {};
    attributes.id = "${swf}";
    
    swfobject.embedSWF("${swf}.swf", "flashDiv", "${width}", "${height}", "9.0.0", "", flashvars, params, attributes);
    
  2. 将其用于 HTML:

    <body>
        <div id="flashDiv"></div>
    </body>
    
  3. 要调用您的 Flash 方法,请使用以下模式:

    // Functions needed for calling Flex ExternalInterface
    function thisMovie(movieName) 
    {
        if (navigator.appName.indexOf("Microsoft") != -1) 
        {
            return window[movieName];
        } 
        else 
        {
            return document[movieName];
        }
    }
    
  4. 调用 Flash 方法:

    function callFlashMethod()
    {
        thisMovie("${swf}").js_method_to_call();
    }
    

【讨论】:

  • 我在萤火虫控制台thisMovie("test").js_method_to_call is not a function得到错误
  • 您是否使用我的示例中的 JS 来加载 SWF?确保 attributes.id = "test"; 占位符变量 ${swf} 仅在您使用 Flash Builder 构建并且此代码放置在 index.template.html 中并且您已正确注释应用程序的入口点 Sprite 时才有效。跨度>
【解决方案3】:

您将获得对嵌入式 SWF 对象的引用,并使用它来调用您的 as3 方法。

//AS3 Code
ExternalInterface.addCallback("helloFromJS",helloFromJS);

private function helloFromJS():void
{
    trace("JS is saying hello");
}


//HTML Code
<object width="100%" height="100%" id="Test">
          <param name="movie" value="Test.swf"/>

//JS Code
var swfObject = document.getElementById("Test");
swfObject.helloFromJS();

【讨论】:

    【解决方案4】:
    【解决方案5】:

    http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/external/ExternalInterface.html?filter_flash=cs5&filter_flashplayer=10.2&filter_air=2.6

    此页面很好地描述了解决方案,只需尝试使该示例工作即可。这样你就可以解决问题了,Vladimir Tsvetkov 的回答就完成了。

    【讨论】:

      猜你喜欢
      • 2012-05-07
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 2013-03-20
      • 1970-01-01
      相关资源
      最近更新 更多