2005/09/01 | javascript+flash 通讯问题
类别(flash As) | 评论(0) | 阅读(828) | 发表于 16:50
写一个具有返回值的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
0

评论Comments

日志分类
首页[193]
flash As[107]
有的没的[59]
数码照片[4]
自由世界[19]
blender[4]