2011-04-27 77 views
1

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

头的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; 
} 

谢谢!

回答

2

据我理解你的问题,你必须做的唯一的事情是改变顺序:)

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

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

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

+0

这太棒了。谢谢! – 2012-01-31 02:39:08

0

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