转载自
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”]; }}οnlοad=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 >