宠辱不惊,看庭前花开花落;去留无意,望天空云卷云舒
« »
2010-01-06Flex+AIR,JavaScript

13,135 Views

AS与JS相互通信(Flex中调用js函数)

AS与JS相互通信(Flex中调用js函数)

Flex中As调用Js的方法是:
1、导入包 (import flash.external.ExternalInterface;)
2、使用ExternalInterface.call(“Js函数名称”,参数)进行调用,其返回的值就是Js函数所返回的值

Js调用As的方法是:
1、导入包 (import flash.external.ExternalInterface;)
2、在initApp中使用ExternalInterface.addCallback(“用于Js调用的函数名”,As中的函数名)进行注册下
3、js中 就可以用document.getElementById(“Flas在Html中的ID”).注册时设置的函数名(参数)进行调用

as和js通信addcallback失效

参考原文:http://www.zhaohongri.cn/?p=14

情况一:flash一旦在浏览器里cache住,如果在as里一开始就addcallback就会失效
情况二:一个js函数上来就调用as的一个函数的时候,页面会报错,提示找不到这个flash对象,或者函数没有定义。Flash8的时代,针对 ExternalInterface这个类,文档里只说明了怎么用,而没有具体说怎么合理的组织和页面的结构,一直到了cs3的时代,帮助里才说明了正确的函数注册和js调用的过程,具体的见Flash cs3帮助。大概的代码如下:

js部分:

<script>
var jsReady=false;
var swfReady=false;

function isReady(){
return jsReady;
}

function setSwfIsReady(){
swfReady=true;
getSWF(”flashobj”).fun()

}

function pageInit(){
jsReady=true;
}

function getSWF(movieName) {
if (navigator.appName.indexOf(”Microsoft”) != -1) {
return window[movieName+”_ob”];
} else {
return document[movieName+”_em”];
}
}

onload=function(){
pageInit();
}

</script>

注意,在getSWF函数里用了 return window[movieName+”_ob”]和return document[movieName+”_em”],在IE下,如果object标签和embed表现用同样的id,通过js去访问flash对象的时候,IE会认不出,FF是没有问题的

as部分

private function registerJsFun():void{
if(ExternalInterface.available){
try{
var containerReady:Boolean=isContainerReady();
//ExternalInterface.call(”ceshi”,”registerJsFun:”+containerReady);
if(containerReady){
//注册函数
setupCallBacks();
}else{
//检测是否准备好
var readyTimer:Timer=new Timer(100);
readyTimer.addEventListener(TimerEvent.TIMER,timeHandler);
readyTimer.start();
}
}catch(error:Error){
trace(error)
}
}else{
trace(”External interface is not available for this container.”);
}
}

private function timeHandler(event:TimerEvent):void{
var isReady:Boolean=isContainerReady();
if(isReady){
Timer(event.target).stop();
setupCallBacks();
}
}

private function isContainerReady():Boolean{
var result:Boolean=Boolean(ExternalInterface.call(”isReady”));
return result;
}

private function setupCallBacks():void{
ExternalInterface.addCallback(”fun”,fun);

ExternalInterface.call(”setSwfIsReady”);
}

具体我就不解释了,不明白的可以仔细去看下cs3帮助,大概的意思就是页面开始渲染的时候js去调用swf对象,有可能swf对象没有完全 load完,所以这个触发器要从flash开始,当flash加载的时候就开始不停的调用页面的一个函数,取一个页面是否加载完毕的标识,当 pageonLoad后,这个标识为true了,说明flash也加载完毕了,这个时候flash再开始注册函数,同时调用页面的js,让js调用 Flash对象

实例:a.mxml

<?xml version=”1.0″ encoding=”utf-8″?>
<mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml” layout=”absolute”>
<mx:Script>
<![CDATA[
import flash.external.*;
public function asFunc():String {
return sending_ti.text;
}

public function initApp():void {
//AddCallback方法允许javascript调用flash时间上函数
ExternalInterface.addCallback("flexFunctionAlias", asFunc);
}

public function callWrapper():void {
var f:String = "changeDocumentTitle";
//ExternalInterface.call(functionName:String,Parameters)可以调用javascript函数
//参数1: functionName – 你想要调用的javascript函数名要以字符串的形式
//参数2: Parameters – 需要传递给javascript函数的参数,用逗号分开,是可选的。
var getJSValue:String = ExternalInterface.call(f,"New Title");
received_ti.text = getJSValue;
}

]]>
</mx:Script>
<mx:Button id=”send_button” x=”368″ y=”100″ click=”initApp();” label=”发送” fontSize=”12″ width=”62″/>
<mx:TextInput id=”received_ti” x=”148″ y=”62″ width=”203″ fontSize=”12″/>
<mx:TextInput id=”sending_ti” x=”148″ y=”100″ width=”203″ fontSize=”12″/>
<mx:Label x=”105″ y=”65″ text=”收到” fontSize=”12″/>
<mx:Label x=”105″ y=”103″ text=”发送” fontSize=”12″/>
<mx:Button x=”368″ y=”64″ click=”callWrapper();” label=”接收” fontSize=”12″ width=”62″/>
</mx:Application>

index.html

<!DOCTYPE HTML PUBLIC “-//W3C//Dtd nowrap HTML 4.01 Transitional//EN”>
<html>
<head>
<base target=”_self”>
<title></title>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<meta http-equiv=”pragma” content=”no-cache”>
<meta http-equiv=”cache-control” content=”no-cache”>
<meta http-equiv=”expires” content=”0″>
</head>

<script language=”JavaScript”>
function callApp() {
var x = MyFlexApp.flexFunctionAlias();
document.getElementById(‘receivedField’).value = x;
}

function changeDocumentTitle(a) {
window.document.title=a;
return document.getElementById(‘sendField’).value;
}
</script>

<body style=’overflow-x:hidden;overflow-y:hidden’>
<form name=”htmlForm”>
数据发送给AS:
<input type=”text” id=”sendField” />
<input type=”button” value=”发送” onclick=”" /><br />
<br />
接收AS的数据:
<input type=”text” id=”receivedField”>
<input type=”button” value=”接收” onclick=”callApp();” /><br />
</form>
<OBJECT id=”MyFlexApp” classid=”clsid:D27CDB6E-AE6D-11cf-96B8-444553540000″codebase=”http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0″ WIDTH=”100%” HEIGHT=”500″>
<PARAM NAME=movie VALUE=”joinJS.swf”>
<PARAM NAME=quality VALUE=high>
<PARAM NAME=scale VALUE=noborder>
<PARAM NAME=bgcolor VALUE=#000000>
<EMBED src=”joinJS.swf” quality=high WIDTH=”100%” HEIGHT=”500″ scale=noborder bgcolor=#000000 NAME=”TH2″TYPE=”application/x-shockwave-flash” PLUGINSPAGE=”http://www.macromedia.com/go/getflashplayer”></EMBED>
</OBJECT>
</body>

随机日志

  • [转]10件安装WordPress后需要做的事
    这又是一篇介绍安装WordPress之后需要做的事情,这是一个系列教程,Wopus系统能通过这个教程让各位菜鸟能学到东西,各位在看教程的过程中有任何疑问,欢迎留言。...
  • PHP MSN Class 最新版,支持MSN
    PHP MSN Class,支持MSNP9 (MSN 6.2)和最新的MSNP15 (WLM 8.1)协议(MSNP15协议支持离线消息),可以作为MSN机器人使用,或者给MSN、雅虎通发消息。 示例代码: 注意:使用MSNP15协议,PHP需要支持mhash;使用msnbot机器人功能,PHP需要支持pcntl。 开发语言: PHP 操作系统: 跨平台 软件主页:http://code.google.com/p/phpmsnclass/ 下载地址:http://code.go...
  • 中文主题站
    下面网址有很多相关的资料 http://themes.wopus.org/...
  • [转]百万级访问网站前期的技术准备
    对互联网有了解的人都有自己的想法,有人就把想法付诸实现,做个网站然后开始运营。其实从纯网站技术上来说,因为开源模式的发展,现在建一个小网站 已经很简单也很便宜。当访问量到达一定数量级的时候成本就开始飙升了,问题也开始显现了。因为带宽的增加、硬件的扩展、人员的扩张所带来的成本提高是显而 易见的,而还有相当大的一部分成本是因为代码重构、架构重构,甚至底层开发语言更换引起的,最惨的就是数据丢失,辛辛苦苦好几年,一夜回到创业前。...
  • 54点提高PHP编程效率
    0、用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说echo是语言结构,不是真正的函数,故把函数加上了双引号)。 1、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。 2、$row[’id’] 的速度是$row[id]的7倍。 3、echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句...

日志信息 »

该日志于2010-01-06 20:59由 Alpha 发表在Flex+AIR, JavaScript分类下, 你可以发表评论。除了可以将这个日志以保留源地址及作者的情况下引用到你的网站或博客,还可以通过RSS 2.0订阅这个日志的所有评论。

相关日志 »

随机日志

  • 秋染深山
    帽子峰林场美在天然纯朴。在此人们可以尽情地欣赏大自然的风光,是假日休闲度假的好去处。这是南雄论坛沈老的作品。...
  • 技术总监谈好的程序员如何写代码
    要判断一个程序员是不是好的程序员,主要看他写的代码,因为程序员最重要的事是写代码。 即便不去理解代码的意图,只要看一眼,好的程序员写的代码与差的程序员写的代码基本上就可以看出来。好的程序员写的代码,整洁而规范,视觉上自然有一种美感。空白错落有致,注释恰到好处,命名和排版遵守统一的规范。差的程序员写的代码则经常出现过长的函数,前后不一致的命名方式和排版,过深的嵌套结构,非常复杂的表达式,随处可见的数字等毛病。 再去粗粗阅读,对好的程序员还是差的程序员就会更有把握。好的程序员写的代码,有一种精心雕琢而成的一...
  • 2010年IT十大人物猜想
    王建宙 我们今年的用户数字是百万级的,到10月份是400万,到年底是500万,明年是千万级的数字,在2009年12月中移动TD终端产品发布会上,中移动总裁王建宙满怀自信,表示将通过加大在TD终端的销售上的激励和补贴,让TD走向普及。已经59岁的王建宙能否让这家网络规模、用户数量全球第一的电信企业,在3G时代完整创造出一条国标产业链并创造新的第一? 朱骏 尽管公司的收入亏损还无法在短时期内得到恢复,但公司在研发上的投资继续加强,研发能力仍在持续提高,自主研发的游戏已经取得了实质性的进展。丧失《魔兽世...
  • 提高程序执行效率,Web开发技巧30条
    目前的Web应用程序都趋于复杂化,从用户的角度而言,如何提高用户操作的响应速度,加快程序的执行效率,是Web开发人员应考虑的问题。   目前的Web应用程序愈发的复杂化,包括拥有富客户端以及大量的JavaScript编码等等,从用户角度而言,让页面加载得更快、对用户的操作响应得更及时,能够给用户提供更为友好的体验,这就需要开发人员应提高应用程序的执行效率,以下是关于提高程序执行效率的小技巧。   1.尽量避免使用DOM。当需要反复使用DOM时,先把对DOM的引用存到JavaScript本地变量里再使用。...
  • Zend Search Lucene实现全文搜索
    简介:Zend_Search_Lucene 是一个完全由 PHP 5 编写的通用文本搜索引擎。由于其将索引保存在文件系统中而不需要数据库支持,因此它几乎可以为任何由 PHP 驱动的网站增加搜索能力。Zend_Search_Lucene 支持下列特性: 具有排名功能的搜索——最符合要求的结果出现在最前面 许多强大的查询类型:短语查询、通配符查询、近似查询、范围查询等 搜索特定的字段,如标题、作者、内容,等等 Zend_Search_Lucene 来源于 Apache Lucene project。要了解关...

没有评论

发表评论 »

返回顶部