通信达flash,Flash的AS与JavaScript的通信原理

名词:
1、文中出现的容器是指承载Flash的HTML页面
一、JS和Flash的通信原理
先不提8以前的通信方法(BTW:因为 Molay 我也不会哈哈)
查看Flash8的内置帮助,发现了flash.external.ExternalInterface类
该类中就包含了MM给我们提供的互相通信方法
该类中有一个属性和两个方法:
属性:available:Boolean [只读],指示此播放器是否位于提供外部接口的容器中。
方法1:addCallback,将 ActionScript 方法注册为可从容器调用。意思就是允许HTML中的JS调用通过该方法注册的AS函数,使FLASH能接受外部的JS提供的数据。
方法2:call,调用由 Flash Player 容器公开的函数,传递零个或多个参数。意思就是允许FLASH使用通过该方法注册的外部JS函数,使FLASH能向外部传送数据。
首先要构造一个合适的FLASH容器(HTML)
以下是一个示例的HTML代码:
代码:
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Language" content="utf-8" /> <title>通信演示</title> </head> <body bgcolor="#ffffff"> <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="400" height="300" id="myFlash" align="middle" > <param name="allowScriptAccess" value="sameDomain" /> <param name="movie" value="CeShi.swf" /> <param name="quality" value="high" /> <param name="bgcolor" value="#ffffff" /> <embed src="CeShi.swf" quality="high" bgcolor="#ffffff" width="400" height="300" name="myFlash" align="middle" allowScriptAccess="sameDomain" swLiveConnect="true" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" /> </object> </body> </html>
红色部分是需要注意的
这里解释一下,因为FLASH的安全沙箱问题
所以除非服务器上承载 HTML 页,否则浏览器就会出现安全警告,而使脚本无效。
id="myFlash"和name="myFlash"是设置FLASH Objects的ID名,此参数将在JS函数中获取FLASH数据的时候使用到。
allowScriptAccess属性/参数
值: always | never | samedomain
说明: 使用 allowscriptaccess 使 Flash 应用程序可与承载它的 HTML 页通信。此参数是必需的,因为 fscommand() 和 getURL() 操作可能导致 JavaScript 使用 HTML 页的权限,而该权限可能与 Flash 应用程序的权限不同。这与跨域安全性有着重要关系。
always 允许随时执行脚本操作。
never 禁止所有脚本执行操作。
samedomain 只有在 Flash 应用程序来自与 HTML 页相同的域时才允许执行脚本操作。
所有 HTML 发布模板使用的默认值均为 samedomain。
swLiveConnect属性
值: true | false
说明: (可选)指定第一次加载 Flash Player 时浏览器是否应启动 Java。如果忽略此属性,默认值为 false。如果在同一页面上同时使用 JavaScript 和 Flash,Java 必须处于运行状态,FSCommand() 函数才能起作用。但是,如果您运行 JavaScript 只是为了检测浏览器或用于其他与 fscommand() 动作无关的目的,则可以通过将 SWLIVECONNECT 设置为 false,从而防止 Java 启动。当没有将 JavaScript 和 Flash 一起使用时,也可以通过将 SWLIVECONNECT 属性明确设置为 true,强制 Java 启动。启动 Java 会显著增加启动 SWF 文件所需的时间,因此,只有在必要时才应将此标记设置为 true。仅适用于 embed。
使用 fscommand() 动作可从独立的放映文件中启动 Java。
二、让flash调用容器中的js方法
在上面一节中我们知道了使用flash.external.ExternalInterface.call方法来调用容器中的JS
以下 Molay 给出一个示例
在该示例中,有三个按钮
分别自定义页面标题
弹出新的定义的窗口(注意使用的不是getURL();方法)
以及在容器指定位置加入输入的文本。
前两个方法很简单,所以就不详细叙述
下面 Molay 着重讲述最后一个方法的用途:
JS代码:
代码:
// 在容器指定位置(ID为Flash2JS)写入内容 function showContent(content){ document.getElementById("Flash2JS").innerHTML=content; }
代码将容器中标记为<div id="Flash2JS"></div>的层填充入用户所输入的文本
例如你在输入框中输入"I"m Molay!"点旁边的按钮
下方的区域就将显示这个文本
也许你会想这个太简单了,有什么用处呢?
呵呵,FLASH的2880限制大家也许都知道
为了性能考虑,FLASH最大只能做2880*2880的大小
这样如果页面太大(也只有用AS做超过2880的页面),就不能显示
你不妨将底下的代码复制到框中,点“显示文本”看看
代码:
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="400" height="300" id="myFlash" align="middle" > <param name="allowScriptAccess" value="sameDomain" /> <param name="movie" value="CeShi.swf" /> <param name="quality" value="high" /> <param name="bgcolor" value="#ffffff" /> <embed src="CeShi.swf" quality="high" bgcolor="#ffffff" width="400" height="300" name="myFlash" align="middle" allowScriptAccess="sameDomain" swLiveConnect="true" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" /> </object>
HOHO~怎么样?下面显示了和上面一模一样的FLASH哦~
FLASH对于HTML元素的支持向来就是为人所诟病
如果我们使用这个方法,不仅能实现数据的无刷新显示
而且可以让HTML显示HTML,就没有什么2880和HTML元素显示问题了
三、JS到FLASH的通信
上面一节我们学会了如何使FLASH调用容器中的JS方法
本节我们将继续学习如何使容器中的JS调用FLASH中的方法
首先在FLASH里面要声明可以被JS调用的AS方法:
代码:
// 注册方法showMsg flash.external.ExternalInterface.addCallback("showMsg", this, showMsg); function showMsg(str:String):Void { // 函数代码 }
在上面的代码中,我们注册了一个showMsg方法
addCallback("showMsg", this, showMsg)
第一个"showMsg"是指从 JavaScript 调用 ActionScript 函数时可使用的名称。此名称不必与 ActionScript 方法的实际名称匹配。所以你可以随便写。
第二个showMsg是指注册的方法名称(AS)
在容器中调用我们要使用以下代码来使JS访问AS方法:
代码:
document["myFlash"].showMsg(str);
在上面的代码中,"myFlash"是FLASH的Object ID名,这个在第一节原理中已经讲述过。
showMsg就是addCallback的第一个参数,可以与被调用的AS函数名称无关
然后后面的str就是要传递给AS函数的参数
Tags:  flash原理 通信达flash

延伸阅读

最新评论

发表评论