写一个具有返回值的javascript函数,如何在flash中调用此函数并接收返回值   
 
---------------------------------------------------------------   
 
  
 
js:   
 
function  refreshflash(){     
 
           var  obj  =  document.all("main");     
 
           obj.SetVariable("message","refresh");   
 
           obj.TCallFrame("message_mc",0);   
 
              
 
           return  false;   
 
}   
 
flash   
 
you  should  have  a  movieClip  in  root  named  message_mc,   
 
when  you  run  the  js  function,  message_mc  will  gotoAndPlay(1);   
 
the  mc  can  use  var  message  now,  and  its  value  equals  "refresh".   
 
 
 
 
 
 
 
声明:本译文只供个人学习参考之用; 
 
本文所有权属于Colin Moock所有; 
 
英文原版链接为:http://moock.org/webdesign/flash/fscommand/ 
 
由于水平有限,其中难免有误,请多多包涵! 
 
如要转载请注明出处,谢谢合作! 
 
 
 
 
 
 
 
目录: 
 
 
 
FS Command命令简介 
 
对FS Command命令的支持 
 
通讯的两个方向 
 
怎样实现Flash 到 JavaScript的通讯 
 
怎样实现JavaScript 到 Flash 的通讯 
 
可取的 Flash JavaScript方法(未译) 
 
相关内容参考(未译) 
 
 
 
 
 
FS Command命令简介 
 
 
 
本文写作的目的就是主要用“fscommand”函数探讨Flash与JavaScript之间的通讯的问题(Flash在Web浏览器中执行JavaScript声明)。但是,fscommand()函数的功能实际上要比这些强大得多。不用太多的细节描述,以下是fscommand()函数简短的概述: 
 
 
 
“fscommand()”是Flash中一个函数的名字,它提供Flash 应用程序的通讯功能(“应用程序”的意思是任何可以播放Flash媒体的工具,无论是自然的,例如标准的独立的Flash Player播放器;还是插件的使用,例如Web浏览器)。例如,基于Web的fscommand()函数可以响应Flash按钮的click事件,执行JavaScript命令。(一会我们将看到JavaScript也可以控制Flash影片的回放功能)。Fscommand()函数也可以和Lingo语言通讯,并且也可以发送内建的命令集到Flash Player播放器中(例如“Quit”,“FullScreen”,“AllowScale”,“ShowMenu”)。 
 
 
 
 
 
对FS Command命令的支持 
 
 
 
好了,让我们回到主题:在Web中使用fscommand()函数。如果你打算为Web开发带有脚本的Flash影片,你必须意识到不是所有的浏览器都支持fscommand()函数。支持该函数的特殊浏览器有: 
 
 
 
·netscape 3 or 4 on win95/98/nt and mac ppc  
 
·internet explorer 3 and greater on win95/98/nt  
 
·netscape 6.2 (and later) running flash player 6.0.40.0 (and later) 
 
 
 
特殊的不支持fscommand()函数的浏览器有: 
 
 
 
·运行在 windows 3.1上的浏览器  
 
·运行在 macintosh 68k 机器上的浏览器 
 
·任何在Mac上运行的IE  
 
·netscape 6.1 和 6.0 运行 flash player 6.0.29.0 或者比较老的版本 (liveconnect 属性不支持mozilla遗留下来的插件。 使用mozilla需要更新插件,可以到这里去更新插件 mozilla plugin api). 察看 bugs 37710 和 18838. 
 
 
 
不支持的浏览器缺少Active X(IE)或者LiveConnect(Netscape 4和更老的版本),要实现在插件和浏览器之间的通讯这些是必需的。此外,对于Flash 3,如果你正为Netscape 4开发包含fscommand 的Flash内容,你需要在每个页面明确的使用LiveConnect来管理包含脚本的Flash影片(你不必在Netscape 6.2和以后的版本使用LiveConnect)。对于支持LiveConnect的浏览器,应把这一属性包含在你的影片的EMBED 标签中,例如 swLiveConnect = “true”。 在执行的过程中,用户将在Netscape状态栏中看到 ”Starting Java…”,并且当Java加载时要等待一会。 
 
 
 
 
 
通讯的两个方向 
 
 
 
那么现在,我们知道了在哪里可以使用fscommand函数的功能;你也许想知道它是怎样工作的。我们首先检测基于fscommand功能的Flash到JavaScript的通讯。然后,我们将再看看发送信息的另一种方法:JavaScript到Flash的通讯。 
 
 
 
 
 
怎样实现Flash 到 JavaScript的通讯 
 
 
 
(在研究用fscommand()函数执行JavaScript代码之前,应该注意的是JavaScript也可以通过getURL()函数来调用,就象用锚标记<A>调用JavaScript一样)。GetURL()函数与fscommand()函数相比,会获得更广泛的浏览器的支持,暂且不提它为编码带来的便利。要了解更多的信息,参考用JavaScript调用getURL函数来开启一个窗口。现在让我们回到对fscommand()函数的讨论中)。 
 
 
 
无论fscommand()函数是否执行,Flash都试图发送消息给JavaScritp。当浏览器收到一个来自Flash的fscommand命令,它会检测:是否存在一个与之匹配的JavaScript函数(或者IE浏览器中VB Script函数),该函数可以“捕获”fscommand命令。如果存在这样的函数,浏览器将执行这个“捕获”函数,并且发送两个参数给这个函数——这两个参数就是fscommand() 函数中“Command”和“Arguments”参数。 
 
 
 
如下所示得图表图解了这个过程,该范例用fscommand()函数来调用JavaScript警告框。Fscommand的参数是”call_alert”和”Hello world!”, 
 
 
 
如下所示: 
 
 
 
fscommand(“call_alert”, “Hello world!”); 
 
 
 
执行这个fscommand命令在Netscape和IE中有略微不同;下面的图示显示了该命令在两个浏览器中的传递(从Flash到JavaScript)。图示下面是相应的Flash范例,看看这个模型,我们接来就分析实现这一功能的细节。 
 
 
 
 
 
观看演示文件 
 
 
 
FS Command影片范例:Flash调用JavaScript警告框 
 
 
 
让我们一起完成如上图所示的Flash调用JavaScript的FS Command方法。你可以下载这个范例1的Zip文件,它包括.fla,.swf和.html格式文件。具体操作如下(请注意:以下操作均在 Flash MX Professional 2004中进行): 
 
 
 
1)在Flash中建立FS Command语句: 
 
 
 
·新建一个影片,在时间线上开始的几桢上随意设置一个关键桢; 
 
 
 
·选中该关键桢,按F9,打开动作面板; 
 
 
 
·在动作面板中点击“动作”下面的“+”按钮,选择“全局函数”---“浏览器/网络”---fscommand()函数。然后,“fscommand”命令便加入到动作列表中。该函数参数包括两个部分“Command”和“Arguments”。这两个参数将被传递到JavaScript的“fscommand捕获”函数中。它们可以用在任何条件下,但是通常情况下,Command参数包含一个你想执行的函数名称;Arguments参数包含你提供的参数; 
 
 
 
·在括号中输入“"call_alert", "Hello world!"”; 
 
 
 
2)把你的影片嵌入到HTML文档中: 
 
 
 
为你的影片建立一个HTML文档,并且使用OBJECT 和EMBED标记放置你的影片。在OBJECT 和EMBED标记中,确定你影片的名字,为OBJECT标记使用”ID”,为EMBED标记使用”NAME”。影片的名字是非常重要的,因为这个名字将被OBJECT 和EMBED标记识别出来。你的FS Command捕获函数将依靠影片的名字来识别所有捕获的FS Command命令。另外要记住的是对于Netscape浏览器的LiveConnect参数用“swLiveConnect = “true””来替换。你的页面应该象下面这样(ID、NAME和swLiveConnect都加粗了,不要忘记它们): 
 
 
 
<HTML> 
 
<HEAD> 
 
<TITLE>My First FS Command</TITLE> 
 
</HEAD> 
 
 
 
<BODY> 
 
 
 
<OBJECT 
 
CLASSID="clsid : D27CDB6E-AE6D-11cf-96B8-444553540000" 
 
WIDTH="100%" 
 
HEIGHT="100%" 
 
CODEBASE="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" 
 
ID=testmovie> 
 
<PARAM NAME="MOVIE" VALUE="mymovie.swf"> 
 
<PARAM NAME="PLAY" VALUE="true"> 
 
<PARAM NAME="LOOP" VALUE="true">  
 
<PARAM NAME="QUALITY" VALUE="high"> 
 
<PARAM NAME="SCALE" VALUE="SHOWALL"> 
 
 
 
<EMBED 
 
NAME="testmovie" 
 
SRC="mymovie.swf" 
 
WIDTH="100%" 
 
HEIGHT="100%" 
 
PLAY="false"  
 
LOOP="false" 
 
QUALITY="high" 
 
SCALE="SHOWALL"  
 
swLiveConnect="true" 
 
PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer"> 
 
</EMBED> 
 
</OBJECT> 
 
</BODY> 
 
</HTML> 
 
 
 
3)为IE浏览器加入VB Script代码: 
 
 
 
还记得在图示1中的第2个场景吗?IE浏览器使用很小的VB Script代码来捕获fscommand命令,然后把它传递给JavaScript。这就是接下来你要做的。把如下的VB Script代码放在HTML文档的HEAD标记内,确定把文字“testmovie”改为你在OBJECT 和EMBED标记为你的影片起的名字。 
 
 
 
<SCRIPT LANGUAGE="VBScript"> 
 
<!--  
 
// Catch FS Commands in IE, and pass them to the corresponding JavaScript function. 
 
 
 
Sub testmovie_FSCommand(ByVal command, ByVal args) 
 
call testmovie_DoFSCommand(command, args) 
 
end sub 
 
 
 
// --> 
 
</SCRIPT> 
 
 
 
4)加入JavaScript函数来捕获fscommand命令: 
 
 
 
到目前为止,我们已经建立了影片,它可以发送fscommand命令到浏览器上;影片也已经被嵌入到HTML页面中,也建立了VB Script代码,它可以为JavaScript捕获fscommand命令——如果你的浏览器是IE的话。把如下的JavaScript代码放到HEAD标记中,确定把文字“testmovie” 改为你在OBJECT 和EMBED标记为你的影片起的名字。 
 
 
 
<SCRIPT LANGUAGE="JavaScript">  
 
<!--  
 
function testmovie_DoFSCommand(command, args) {  
 
if (command == "call_alert") {  
 
alert("Here's the Flash message: " + args); 
 
} 
 
} 
 
//--> 
 
</SCRIPT> 
 
 
 
对于JavaScript的一点解释。“testmovie_DoFSCommand”函数随时调用名称为“testmovie”的发送fscommand命令的影片。“DoFSCommand” 关键字是Flash用来识别的函数,该函数被fscommand命令加载。前缀“testmovie_”指出被命令调用的影片的名称。因此,当一个名为“testmovie”的影片调用FS Command命令时,名为“testmovie_DoFSCommand”的函数将被加载。“(command, args)”是传递给函数的两个参数,并传送我们在Flash动作面板输入的 “Command”和“Arguments”的参数值——“call_alert”和“Hello world!” 
 
 
 
一旦你的JavaScript函数放置好了,你的FS Command函数就可以成功的加载警告框了。 
 
 
 
你已经学会了如何从Flash向JavaScript发送信息。如果你想进一步了解以上的内容,记得下载范例1的Zip文件。接下来你将学会怎样用JavaScript控制Flash。 
 
 
 
 
 
 
 
怎样实现 JavaScript 到 Flash 的通讯 
 
 
 
通过调用Flash影片对象的内建的方法,JavaScript可以向Flash发送命令。调用Flash方法的操作就象所有的调用JavaScript内建的方法一样(比如:document.write()或者window.close())。从开发者的角度来看,这种通讯的方式是在一端通过JavaScript方法完全控制Flash影片,在Flash影片中不需要额外添加代码。 
 
 
 
我将演示一个简单的范例:通过调用JavaScript的Flash方法控制影片。然后你就可以推断这种技术并应用于任何可用的Flash方法中(完整的关于Flash 2.0和Flash 3.0的方法,请参阅Macromedia Flash方法的参考文档)。来看看这个范例文件:JavaScript控制Flash。 
 
 
 
范例2:JavaScript控制Flash影片 
 
 
 
接下来的步骤讲解了怎样实现这一技术,作为参考,你可以下载本例的Zip文件。 
 
 
 
1)在HTML文档中嵌入你的影片 
 
 
 
建立一个HTML文档,并用OBJECT 和 EMBED 标记把你的影片置入到文档内。注意你的OBJECT 和 EMBED 标记内部,确定为OBJECT标记使用”ID”,为EMBED标记使用”NAME”。你的影片的名称是非常重要的,因为它们将被识别出来。你的JavaScript函数要通过影片的名称控制它。也要记住的是对于Netscape浏览器的LiveConnect参数用“swLiveConnect = “true””来替换。你的页面应该象下面这样(ID、NAME和swLiveConnect都加粗了,不要忘记它们): 
 
 
 
<HTML> 
 
<HEAD> 
 
<TITLE>JavaScript controls Flash</TITLE> 
 
</HEAD> 
 
 
 
<BODY> 
 
 
 
<OBJECT 
 
CLASSID=" clsid : D27CDB6E-AE6D-11cf-96B8-444553540000" 
 
WIDTH="100%" 
 
HEIGHT="100%" 
 
CODEBASE=" http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" 
 
ID=testcommand> 
 
<PARAM NAME="MOVIE" VALUE="mymovie.swf"> 
 
<PARAM NAME="PLAY" VALUE="false"> 
 
<PARAM NAME="LOOP" VALUE="false">  
 
<PARAM NAME="QUALITY" VALUE="high"> 
 
<PARAM NAME="SCALE" VALUE="SHOWALL"> 
 
 
 
<EMBED 
 
NAME="testcommand" 
 
SRC="mymovie.swf" 
 
WIDTH="100%" 
 
HEIGHT="100%" 
 
PLAY="false"  
 
LOOP="false" 
 
QUALITY="high" 
 
SCALE="SHOWALL"  
 
swLiveConnect="true" 
 
PLUGINSPAGE=" http://www.macromedia.com/go/getflashplayer"> 
 
</EMBED> 
 
</OBJECT> 
 
</BODY> 
 
</HTML> 
 
 
 
2)增加一个跨浏览器的函数来查询你的影片对象 
 
 
 
有两个主要的组成部分来实现JavaScript对Flash的调用:⑴调用Flash方法的函数;⑵为查询Flash影片对象返回恰当语句的函数。别指望Microsoft和Netscape采用相同的方法来执行这些操作。因此,首先你需要做的就是添加的正确语句(为Netscape 的"document[moviename]" 和为微软IE的 "window[moviename]")。只需要编写少量的代码,然后把它放入对Flash调用方法的脚本中,你不用考虑它的兼容性。当我们调用任何Flash方法时,我们将调用这个兼容性函数,代码如下: 
 
 
 
<SCRIPT LANGUAGE="JavaScript">  
 
<!--  
 
var movieName = "testcommand"; 
 
 
 
function thisMovie(movieName) { 
 
// IE and Netscape refer to the movie object differently. 
 
// This function returns the appropriate syntax depending on the browser. 
 
if (navigator.appName.indexOf ("Microsoft") !=-1) { 
 
return window[movieName] 
 
} else { 
 
return document[movieName] 
 
} 
 
} 
 
 
 
设置“movieName”变量的值要匹配你在EMBED和 OBJECT标记设置的影片的名称 
 
 
 
3)增加调用Flash方法的函数 
 
 
 
一旦你解决了兼容性的问题,调用Flash方法就变得很简单了。你可以通过调用“兼容函数”来查询Flash影片对象,并传递一个包含影片名称的变量给“兼容函数”;然后添加你要调用的Flash方法的名称,象这样: 
 
 
 
function playmovie() { 
 
thisMovie(movieName).Play(); 
 
} 
 
 
 
//--> 
 
</SCRIPT> 
 
 
 
稍等一下,还没有这样操作。如果调用一个还没有完成加载的影片的方法,会发生什么呢?错误!这就是所得到的结果。所以你应该检查: 
 
 
 
⑴影片对象是否存在; 
 
⑵执行方法前是否有足够的加载。 
 
 
 
最简单、最可靠方式检查这两个条件的方法就是在影片加载完成以后,设置一个JavaScript变量。在直执行任何JavaScript方法之前,你可以检查这个变量。然而,你也可以用JavaScript评估影片对象,检查影片的加载状态;然后调用“PercentLoader()”方法。以下就是完成这一功能的函数: 
 
 
 
// Checks if movie is completely loaded. 
 
// Returns true if yes, false if no. 
 
function movieIsLoaded (theMovie) { 
 
// First make sure the movie's defined. 
 
if (typeof(theMovie) != "undefined") { 
 
// If it is, check how much of it is loaded. 
 
return theMovie.PercentLoaded() == 100; 
 
} else { 
 
// If the movie isn't defined, it's not loaded. 
 
return false; 
 
} 
 
} 
 
 
 
你也可以在掉用任何方法前,用movieIsLoaded()函数来检查影片的加载状态,象这样: 
 
 
 
function playmovie() { 
 
if (movieIsLoaded(thisMovie(movieName))) { 
 
thisMovie(movieName).Play(); 
 
} 
 
} 
 
 
 
4)增加一个事件给调用Flash方法的函数 
 
 
 
目前你的函数已经准备好控制Flash影片了,你所需要的就是调用它。为了检测的目的,我用一个表单按钮来调用Flash函数: 
 
 
 
<FORM> 
 
<INPUT TYPE="BUTTON" VALUE="Play" ONCLICK="playmovie()"> 
 
</FORM> 
 
 
 
可取的 Flash JavaScript 方法 
 
 
 
你已经学会了怎样调用一个JavaScript方法播放Flash影片。你也可以使用相同的技术来调用任何Flash Player支持的JavaScript方法。可以的Flash 2.0 和3.0版本的方法(未译)已经在下边列出来了,其他的方法则要根据最新的Flash Player版本而定。如果你使用Tell Target方法发送JavaScript命令给Flash影片剪辑,要注意点,这个方法比较麻烦…… 
 
  
 
关于“可取的 Flash JavaScript方法”和“相关内容参考”两部分内容请大家自己去浏览作者的网站吧,这对深入理解fscommand()函数的用法很有意!:) 
 
标签: Tutorials