写一个具有返回值的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