注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

taijihome的博客

 
 
 

日志

 
 

[转]再谈flash调用Javascript   

2009-08-18 16:22:52|  分类: JS |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Flash调用页面中的javascript函数在做一些flash操作页面DOM的应用的时候很有用,在flash actionscript中调用javascript中的函数方法有两个:
getURL(”javascript:checkit()”)
FSCommand(”checkit”,id);
第一种:getURL()实际上的原理相当于HTML中<a href=”javascirpt:alert(’foobar’);”></a>的调用javascript的方式,相当于一个对本页的一个http请求。
第二种:FSCommand(”checkit”,id);原理类似于HTML中<a href=”#” onclick=”checkit(1)” ></a>,相当于直接调用。

这两种方法最大的不同就是前者向浏览器发送新的HTTP请求,后者没有。这样就带来了一个不可预知的问题,IE和firefox对于第一种的请求方式不同。在IE中浏览器会中断当前的所有请求,来响应来自flash getURL新的请求,这会带来什么问题呢?如果页面还没有下载完,正在下载的东东(图片,外部脚本,外部样式)都会停止,导致页面下载不全。这种情况在firefox中不会出现,因为处理方式不同,FF不会把这个当成一个新的HTTP请求,因为请求的地址是一段JS调用,(IE真的很垃圾,纯属个人观点,FFer万岁)。
所以建议如果不能确定flash是在页面下载完成之后才进行JS调用,那么就使用FSCommand吧。
getURL will terminate all of current http requests in internet explorer.FSCommand is ok, so use FSCommand instead of getURL

 

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函数就可以成功的加载警告框了。

http://blog.donews.com/zzw45/archive/2006/12/12/1094859.aspx

  评论这张
 
阅读(1034)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017