使用ExternalInterface从JavaScript调用ActionScript 3.0 / Flash中的函数

时间:2011-04-27 22:23:38

标签: javascript flash actionscript externalinterface

即使确保始终设置“allowScriptAccess”,我也无法使其工作。我成功地将Flash影片放入浏览器并调用ReceiveDataFromFlashMovie()并打印“Got here”,但似乎GetFlashMovieObject()只根据Internet Explorer中的错误消息返回NULL。我错过了什么吗?

HTML文件的负责人:

<script type="text/javascript">
function getFlashMovieObject(movieName)
{
  if (navigator.appName.indexOf("Microsoft") != -1) { 
    return window[movieName] 
  } 
  else { return document[movieName] }
}

function ReceiveDataFromFlashMovie()
{
     document.write("Got here");
     var callResult = getFlashMovieObject("MakingButtons").myFunction();
     return callResult;
}

</script>

HTML:

<script type="text/javascript">
document.write("Hello World.")
ReceiveDataFromFlashMovie();
document.write(callResult)
</script>

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="500" height="500" id="MakingButtons" align="middle">
<param name="allowScriptAccess" value="always" />
<param name="movie" value="MakingButtons.swf" />
<param name="quality" value="high" />
<param name="bgcolor" value="#ffffff" />
<embed src="MakingButtons.swf" quality="high" bgcolor="#ffffff" width="550" height="400" name="MakingButtons" align="middle" allowScriptAccess="always" swlliveconnect="true" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>

ActionScript 3.0:

import flash.text.TextField;
import flash.external.*;
// The name of the Flash variable to be called in JavaScript
var flashFunction:String = "myFunction";
var instance:Object = null;

// Callback function executed by the name of variable
var realFunction:Function = callMe;
ExternalInterface.addCallback(flashFunction, realFunction);

var foo = "Goodbye!";
function callMe():String
{
    return foo;
}

谢谢!

3 个答案:

答案 0 :(得分:2)

据我了解您的问题,您唯一需要做的就是更改顺序:)

<script type="text/javascript">
document.write("Hello World.")
ReceiveDataFromFlashMovie();
document.write(callResult)
</script>

在对象嵌入代码之后。它没有找到它(返回undefined),因为它尚未嵌入。

答案 1 :(得分:1)

如果您使用swfObject嵌入Flash影片,则可以使用 swfobject.getObjectById 来检测您的swf并调用您的方法。

swfobject.getObjectById("MakingButtons").myExternalMethod();

如果您不使用swfObject,只需复制并通过JS代码上的getObjectById方法:

function getObjectById(objectIdStr) {
        var r = null;
        var o = getElementById(objectIdStr);
        if (o && o.nodeName == "OBJECT") {
            if (typeof o.SetVariable != UNDEF) {
                r = o;
            }
            else {
                var n = o.getElementsByTagName(OBJECT)[0];
                if (n) {
                    r = n;
                }
            }
        }
        return r;
    }

通过这样做来打电话:

getObjectById("MakingButtons").myExternalMethod();

看看这个,我实际上在我的博客上编写了一个小例子:http://www.nelsond8.com/?p=515

答案 2 :(得分:0)

您不允许加载/初始化SWF 在您可以访问SWF内部的任何内容之前,您需要确保它已准备好处理回调。