◇关于FSCommand...◇
 
  “FSCommand”是Flash系统用来和支持他的其他应用程序(指那些可以播放Flash电影的应用程序,如:独立播放器‘Flash Player’或安装了插件的浏览器)互相传达命令的工具。 
  在WEB上,FSCommand的典型应用是Flash发送命令给脚本语言(Javascript或VBScript)或脚本语言发送命令给Flash。一般地,基于WEB的FSCommand的用法有:a)在Keyframe或按钮的Action里调用一个脚本程序;b)脚本程序控制Flash Movie的播放(停止,播放,或使指针跳到某一特定Frame即Goto Frame)。在Flash里已经内建有一系列专供Flash Player使用的FSCommand:Quit,FullScreen,Exec,Show Menu。具体可以查看Flash的帮助文件。由于Flash 4在这方面并未做太大改动,只加进了Expression以扩大其使用灵活性,因此,本文仍以Flash 3做讲解。至于Expression的使用请参看有关文章。 
 
>> 支持FSCommand << 
  支持FSCommand的浏览器有:运行于Win95/98/NT和Mac PPC的Netscape 3及以上;运行于Win95/98/NT的Internet Explorer 3及以上;装有ActiveX(IE)或LiveConnect(Netscape)的运行于Win 3.1或Mcintosh 68K上的浏览器及在Mac上的IE。另外,从Flash 3开始,如果要在Netscape里使用FSCommand,必须在每页里加上LiveConnect=True语句。 
 
>> 传递命令的两个方向 << 
  FSCommand如何工作取决于是由Flash或Javascript发送指令或接收指令。这两种方式虽然都和FSCommand有关,但是,他们的操作却是不同的,本文将分别讲解,但是,请记住:在实际应用里,往往会同时用到二者,即协同更复杂的工作。 
 
>> Flash对JavaScript的调用 << 
  Flash对Javascript调用是通过在Keyframe的属性或按钮的Action里设置命令。当浏览器接收到来自于Flash的FSCommand时,便会检查是否有可供调用的Javascript函数(或IE使用的VBScript)。如果有,就运行他,并发送两个参数:“Command”和“Argument”。 
下面,让我们来看一个例子: 
1)在Flash里设置FSCommand命令 
  在FScommand的对话框里有两栏:Command和Argument,这里面所填的内容将被传到调用的函数里作为参数。一般说来:Command栏填的是你想调用的函数名;Argument栏则填上函数使用的参数。在本例中:Command栏填“call_alert”;Argument栏填“Hello world” 
2)将Movie嵌入HTML文档中 
  这份文档可以用ShockWave生成,注意要有“swLiveConnect="true"”语句。 
3)加入被调用的Javascript函数 
将代码放入<Head>里: 
<SCRIPT LANGUAGE="Javascript> 
<!--- 
function testmovie_DOFSCommand(command,args) 

if(command="call_alert") 
alert("Here's the Flash message:"+args); 

//--> 
</SCRIPT> 
  这里有些地方需注意:语句testmovie_DOFSCommand意思是调用该函数的Movie名是testmovie,这是由你起的;而DOFSCommand则是Flash执行FScommand的专用语句,一定要有。本例中,该命令将传出两个参数:call_alert和Hello World! 
  好了,这就是Flash调用Javascript函数的方法。其实,在不需要传递函数参数的情况下,用Get URL来调用Javascript将更简单。 
 
>> JavaScript对Flash的控制 << 
  与上面相反的是,Javascript也可以控制Flash Movie的播放,方法是通过调用一些内建的Movie属性。而调用这些属性的方法和调用Javascript的内建属性(document.write()或window.close())是一样的。你可以完全在Javascript里控制Flash Movie的各种播放,而不需在Movie里做任何事情。 
  下面,我们就一个简单的例子来说明Javascript如何控制Flash Movie,你可以将他扩展到任何其他可用属性(关于这些属性,可以查看Macromedia Flash的相关文档): 
1)和上例一样,先建立一个Movie;然后用Aftershock将其嵌入到HTML中; 
2)在生成的HTML中加入控制Flash Movie的Javascript代码,本例中: 
function playmovie() 

movieobject(moviename).Play(); 

  有一点很重要的是:当你调用一个尚未下载完的属性时,会发生什么情况?Errors!所以,你必须先做个检查:a)所用的Movie对象存在;b)它已下载完成,可以调用其属性。最简单也是最可靠的能同时检查是否满足上述两个条件的是:用Javascript调用Movie的PercentLoaded()属性来判断要控制的Movie对象是否已下载完成。 
所以,上面的playmovie函数应改为: 
var movie_ready="false" 
function playmovie() 

if(movie_ready=="false") 

while(movie_ready=="false") 

if(movieobject(moviename).PercentLoaded()==100) 

movieobject(moviename).Play(); 
move_ready="true"; 



else 
{movieobject(moviename).Play(); 


  这样,函数便会等到要调用其属性的Movie对象下载完成后才开始作用,就不会出现错误了。记得要在整个调用函数之外初始化全局变量movie_ready,这样,他的值便会留在内存中而作用于整个Movie的播放过程。 
3)加入调用该函数的事件 
你可以: 
<FORM> 
<INPUT TYPE="BUTTON" VALUE="play" ONCLICK="playmovie()"> 
</FORM> 
就这样!:) 
4)扩展应用到其他属性 
  现在你已知道如何用Javascript调用Flash Movie的内建属性Play()了。还有不少属性可以调用,下面是Flash 3里可以用的属性(要得到最新的属性资料,请查看Mocromedia的相关文档)。 
■Flash 2.0和Flash 3.0的通用属性: 
Play():播放Movie 
StopPlay():停止Movie 
IsPlaying():检查Movie是否正在播放 
GotoFrame(x):Goto到第"X"Frame,"X"为整数 
TotalFrames():检查该Movie总共有多少个Frame 
Rewind():Goto到Frame 1并停止 
SetZoomRect(x1,y1,x2,y2):按给定坐标缩放矩形,其中x1,y1为左上角坐标;x2,y2为右下角坐标。其单位是TWIPS,这里1440 TWIPS折合1英寸,在一个点(Point)里有20个TWIPS。 
Zoom(persent):放大。有以下几种情况:Zoom(50)=原来Movie的两倍;Zoom(200)=原来Movie的1/2大;Zoom(0)=返回原来大小。 
Pan(x,y,mode); 
PercentLoaded():检查Movie已下载了多少到浏览器里。并返回一个0到100的值。 
■以下是Flash 3.0新增的属性: 
在Flash 3里,Movie可以被“Tell Target”控制。这里面的可用的具体方法有: 
TGotoFrame(target,framennumber);TGotLabel(target,framenumber)。 
关于这两个方法,有几点须注意:1)"target"是一个字符串,必须加上双引号;2)"framenumber"是一个整数;3)"framenumber"在Javascript里是从0开始计算的,而在Flash里则是从1开始计算。看以下几个例子: 
eg1:TGotoFrame("_level0/",5)------在主Movie的Timeline里,到第4个frame; 
eg2:TGotoFrame("_level0/colours",5)-----在Instance name为colours的Movie Clips里,到第4个Frame; 
eg3:TGotoLabel("_level0/","redframe")----在主Movie里,到一个label名为redframe的frame; 
eg4:TGotoLabel("_level0/colours","greenframe")---在一个Instance name为colours的Movie Clip里,到一个label名为greenframe的frame; 
除了以上两个方法,tell Target还有以下方法: 
TCurrent(target):返回当前正在播放的Movie的播放指针所正在的frame的数值。用"_level0/"指向主Movie; 
String TCurrentLabel(target):同上,但返回的是字符串Label名,如果该Frame没有Label 名,则返回null。也是用"_level0/"指向主Movie; 
TPlay(target):播放指定的Movie Clip; 
TStopplay(target):停止播放指定的Movie Clip; 
LoadMovie(layer,url):从指定url里Load一个Movie到指定的Layer类,注意Layer必须是整数;url必须加上双引号。 
 
■下面再提供一些关于FSCommand的资源,E文好的朋友可以去取取经: 
1)Macromedia的技术文档:Scripting With Flash 
2)Macromedia的教程:Scripting With Flash and ActiveX 
3)Javascript/Flash Clock Toturial 介绍用FSCommand做Flash时钟的教程(本站也有介绍) 
4)FSCommand methods Table 一个很完整的介绍了可供Jvascript使用的FSCommand的方法,包括Active X和独立播放器(stand-alnoe Player)。 

解决方案 »

  1.   

    可以啊
    我记得是loadURL("javascript:test()")
    flash必须放在这个网页内哦!
      

  2.   

    成功了一半,
    我用的是 .Net开发,在用户登录的时候需要点一个运行于服务器端的按钮,按钮在提交给一个函数
    <input type="submit" name="GSecurityLogin:bS" value="登录" onclick="if (typeof(Page_ClientValidate) == 'function') Page_ClientValidate(); " language="javascript" id="GSecurityLogin_bS" style="" />由于美工的需要,程序把握的登录用户名、密码和提交放在一个隐藏的 <DIV>中,用Flash这个漂亮的登录界面,这一步到现在实现了在Flash中点Flash的“提交”按钮触发真正的提交按钮事件,我本来想也就是执行
    onclick="if (typeof(Page_ClientValidate) == 'function') Page_ClientValidate(); " 这段代码,可是出错了!!!!!跟踪了半天,发现结果如下:我发现 Page_ClientValidate 函数是提交前需要进行验证工作function Page_ClientValidate() {
        var i;
        for (i = 0; i < Page_Validators.length; i++) {
            ValidatorValidate(Page_Validators[i]);
        }
        ValidatorUpdateIsValid();    
        ValidationSummaryOnSubmit();
        Page_BlockSubmit = !Page_IsValid;
        return Page_IsValid;
    }
    。。
    最终在调用 这个函数后提交到服务器function ValidatorCommonOnSubmit() {
        event.returnValue = !Page_BlockSubmit;
        Page_BlockSubmit = false;
    }程序运行到这里出问题了,event为空!!!!!!1!
    原来,点Flash上的按钮不产生IE的事件~~~~~!!!我现在就是想 在点Flash中的按钮的时候,调用我的javascript函数
    我的javascript函数 new 一个event 给IE
    然后提交