`

JavaScript与ActionScript3交互问题总结

    博客分类:
  • Flex
阅读更多

费好大的劲,终于搞定JavaScript和ActionScript3的交互问题了,呵呵,总结一下。在网上参考了好多资料,感觉http://www.coolcode.cn/show-291-1.html 和ActionScript3权威编程 最管用,在这里谢过了。

 

ActionScript3和外部的调用,一般采用ExternalInterface来调用,下面都是以这个接口的使用为例。

 

1.ActionScript调用JavaScript:

    这个比较简单,一般都不太会出错,直接用ExternalInterface.call就可以:

  Flex代码:

var temp_str :String= new String(ExternalInterface.call("winClose",aa));

 这里的winClose表明将要调用的JavaScript方法,aa是参数

  JavaScript:

 

function winClose(upData){
    alert(upData);
    return upData;
}

 2.JavaScript调用ActionScript3:

 

     这里我是采用http://www.coolcode.cn/show-291-1.html 上介绍的方法,就是首先在 js 中设置两个标志,例如 jsReady 和 swfReady 这两个变量作为标志,开始都设置为 false,当 window.onload 时,设置 jsReady 为 true,在 Flash 中一开始检查 JavaScript 中的这个 jsReady 标志是否是 true(通过 ExternalInterface.call 方法调用 JavaScript 中的返回这个标志的一个函数),如果不为 true,就设置一个定时器,经过一段时间后(例如 50 或 100 毫秒)重复这个检查这个标志,一旦为 true,则执行 ExternalInterface.addCallback 来发布 ActionScript 要提供给 JavaScript 调用的函数或方法,执行完所有的 ExternalInterface.addCallback 后,通过 ExternalInterface.call 方法调用 JavaScript 中的设置 swfReady 标志的函数设置 swfReady 为 true。之后,当 JavaScript 检测到 swfReady 为 true 后,再调用 ActionScript 中的方法。

好了,看看Flex代码:

			import mx.controls.Alert;
			import flash.events.MouseEvent;
			import flash.external.ExternalInterface;
			import flash.utils.Timer;
			import flash.events.TimerEvent;
			
			internal var aa:String ="你好";
			internal var jsReady:Boolean;
			internal var timer:Timer = new Timer(1000,60);
			internal function initApp():void{
				var externalAvailable:Boolean = ExternalInterface.available;
				this.tip_txt.text="当前的 Flash Player 是否位于提供外部接口的容器:"+externalAvailable;
				btn.addEventListener(MouseEvent.CLICK,handler);
			}
			internal function handler(evt:MouseEvent):void{
				
				var temp_str :String= new String(ExternalInterface.call("winClose",aa));
				jsReady = new Boolean(ExternalInterface.call("JSReady",aa));
				Alert.show(temp_str+","+jsReady,"提示信息",Alert.YES| Alert.NO);
				if(!jsReady){
					
					timer.addEventListener(TimerEvent.TIMER,timerHandler);
					timer.start();
				}else{
					ExternalInterface.addCallback("sayHello",sayHello);
					ExternalInterface.call("setSwfReady",true);
					this.tip_txt.text = "setSwfReady is invoked and set to true;sayHello is added to ExternalInterface.";
				}
				
			}
			internal function timerHandler(evt:TimerEvent):void{
				jsReady = new Boolean(ExternalInterface.call("JSReady",""));
				if(jsReady){
					timer.stop();
				}
			}
			
			public function sayHello(txt:String):void{
				this.tip_txt.text="JS调用ActionScript成功!这是从JavaScript端传递过来的值: "+txt;
			}

 上面是全部的AS代码,下面是对应的HTML代码(全):

<!-- saved from url=(0014)about:internet -->
<html>

<!-- 
Smart developers always View Source. 

This application was built using Adobe Flex, an open source framework
for building rich Internet applications that get delivered via the
Flash Player or to desktops via Adobe AIR. 

Learn more about Flex at http://flex.org 
// -->

<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />

<!--  BEGIN Browser History required section -->
<link rel="stylesheet" type="text/css" href="history/history.css" />
<!--  END Browser History required section -->

<title></title>
<script src="AC_OETags.js" language="javascript"></script>

<!--  BEGIN Browser History required section -->
<script src="history/history.js" language="javascript"></script>
<!--  END Browser History required section -->

<style>
body { margin: 0px; overflow:hidden }
</style>
<script language="JavaScript" type="text/javascript">
<!--
// -----------------------------------------------------------------------------
// Globals
// Major version of Flash required
var requiredMajorVersion = 9;
// Minor version of Flash required
var requiredMinorVersion = 0;
// Minor version of Flash required
var requiredRevision = 28;
// -----------------------------------------------------------------------------
// -->
</script>

<script language="JavaScript" type="text/javascript">
	var jsReady=false;
	var swfReady=false;
	function atReady(){
		jsReady=true;
	}
	function JSReady(){
		return jsReady;
	}
	function setSwfReady(ready){
		swfReady=ready;
	}
	function callAS(){
		if(swfReady){
			var value=document.getElementById('clientValue').value;
			if(value){
				HelloWorld.sayHello(value);
			}else{
				HelloWorld.sayHello("Hello,World");
			}
			
		}else{
			alert("swfReady is: "+ swfReady);
		}
	}
</script>
</head>

<body scroll="no" onload="atReady();">
<script language="JavaScript" type="text/javascript">
function winClose(upData){
    alert(upData);
    return upData;
}

</script>


<script language="JavaScript" type="text/javascript">
<!--
// Version check for the Flash Player that has the ability to start Player Product Install (6.0r65)
var hasProductInstall = DetectFlashVer(6, 0, 65);

// Version check based upon the values defined in globals
var hasRequestedVersion = DetectFlashVer(requiredMajorVersion, requiredMinorVersion, requiredRevision);

if ( hasProductInstall && !hasRequestedVersion ) {
	// DO NOT MODIFY THE FOLLOWING FOUR LINES
	// Location visited after installation is complete if installation is required
	var MMPlayerType = (isIE == true) ? "ActiveX" : "PlugIn";
	var MMredirectURL = window.location;
    document.title = document.title.slice(0, 47) + " - Flash Player Installation";
    var MMdoctitle = document.title;

	AC_FL_RunContent(
		"src", "playerProductInstall",
		"FlashVars", "MMredirectURL="+MMredirectURL+'&MMplayerType='+MMPlayerType+'&MMdoctitle='+MMdoctitle+"",
		"width", "800",
		"height", "600",
		"align", "middle",
		"id", "HelloWorld",
		"quality", "high",
		"bgcolor", "#869ca7",
		"name", "HelloWorld",
		"allowScriptAccess","sameDomain",
		"type", "application/x-shockwave-flash",
		"pluginspage", "http://www.adobe.com/go/getflashplayer"
	);
} else if (hasRequestedVersion) {
	// if we've detected an acceptable version
	// embed the Flash Content SWF when all tests are passed
	AC_FL_RunContent(
			"src", "HelloWorld",
			"width", "800",
			"height", "600",
			"align", "middle",
			"id", "HelloWorld",
			"quality", "high",
			"bgcolor", "#869ca7",
			"name", "HelloWorld",
			"allowScriptAccess","sameDomain",
			"type", "application/x-shockwave-flash",
			"pluginspage", "http://www.adobe.com/go/getflashplayer"
	);
  } else {  // flash is too old or we can't detect the plugin
    var alternateContent = 'Alternate HTML content should be placed here. '
  	+ 'This content requires the Adobe Flash Player. '
   	+ '<a href=http://www.adobe.com/go/getflash/>Get Flash</a>';
    document.write(alternateContent);  // insert non-flash content
  }
// -->
</script>
<noscript>
  	<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="HelloWorld" width="800" height="600"
			codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab">
			<param name="movie" value="HelloWorld.swf" />
			<param name="quality" value="high" />
			<param name="bgcolor" value="#869ca7" />
			<param name="allowScriptAccess" value="sameDomain" />
			<embed src="HelloWorld.swf" quality="high" bgcolor="#869ca7"
				width="800" height="600" name="HelloWorld" align="middle"
				play="true"
				loop="false"
				quality="high"
				allowScriptAccess="always"
				type="application/x-shockwave-flash"
				pluginspage="http://www.adobe.com/go/getflashplayer">
			</embed>
	</object>
</noscript>

<div>
<input id="clientValue" type="text" size=20 /><input type="button" onclick="callAS();" value="JS2AS" />
</div>

</body>
</html>
 

    3.遇到的问题:

 

 

     1)ExternalInterface的参数个数问题:

 

         与跟 Flash 8 中跟 ActionScript 2.0 交互所使用的 flash.external.ExternalInterface 还是有所不同的。最大的不同就是 ExternalInterface.addCallback 方法在 ActionScript 3.0 中只有 2 个参数了,而不再有 instance 这个参数。

     2)JavaScript 调用 Flash 中的 ActionScript 方法时报告该方法不存在:

 

     这个问题是跟 Flash 中执行 ExternalInterface.addCallback 的时间有关的,ExternalInterface.addCallback 必须要在 HTML 的完全载入之后也就是 window.onload 事件执行后才可以执行,否则,它所发布的方法都无法在 JavaScript 中调用。

     另外,在调用AS3暴露的接口时,还必须指定flashObject的id,即必须使用类似这样的方法进行调用:

 

var callResult = flashObject.myFunction("my name");

 

 

   3)动态创建的Flash对象在IE上的问题:

 

      如果你是通过 JavaScript 动态创建的 Flash 标签然后插入到 html 中的话(例如通过 innerHTML 赋值的方法或者 appendChild 的方法),很可能你这个操作是在 window.onload 之后才进行,在这种情况下,其它浏览器可以正常进行 JavaScript 和 ActionScript 3.0 的交互,IE 就不行。所以,为了保险,最好的方法就是直接把 flash 标签的 html 写在 html 的 body 中,或者用 JavaScript 的 document.write 来写入 html 的 body 中,后面这种方法对于 IE 来说更合适一些,因为这样的话,可以不需要点击激活 Flash。

    另一个问题是,不要在 ActionScript 中发布名字为 invoke 的方法,否则在 IE 中,JavaScript 调用该方法时会出错。

 

   4)Flash放在form中的问题:

 

    不要把 flash 放到 form 中,否则在 IE 中,JavaScript 调用 ActionScript 时会出错。当然,网上也给出了一个解决这个问题的脚本 ,不过那个貌似是针对 Flash 8 的 ActionScript 2.0 的,我没有试过,不知道对 ActionScript 3.0 是否同样有效。

 

 

   5) 参数中含有 \的问题:

 

     如果为 HTML 页中的 Flash Player 实例指定的名称(object 标签的 id 属性)包含连字符 (-)
   或在 JavaScript 中定义为运算符的其它字符(如 +、*、/、\、. 等),则在 Internet Explorer
中查看容器网页时,将无法从 ActionScript 调用 ExternalInterface。

      如果在 ActionScript 中通过 ExternalInterface.call 调用 JavaScript 时,如果传递的参数有字符串,那么字符串中如果包含 \ 符号的话,那么将会调用失败。这个也是 ActionScript 和 JavaScript 交互的一个 bug,解决办法是,对传递的字符串先进行一下处理在传递,处理方法很简单,比如要传递的数据是 data,将它进行一次 data.replace(/\\/, “\\\\”) 替换之后,在传递给 JavaScript 就可以了。

 

 下载:

    见附件

分享到:
评论
3 楼 iswspx 2011-08-08  
标记一下,正好要用到这个.多谢楼主
2 楼 yunmoxue 2009-10-20  
1 楼 ghasddyx 2008-10-19  

相关推荐

    javascript与actionscript的交互.[课件]

    3. JavaScript 与 ActionScript 的交互: - Flash External Interface (FSCommand):这是早期实现 JS 和 AS 交互的方法,通过在 Flash 内部调用 JavaScript 函数或从 JavaScript 调用 Flash 公开的方法。FSCommand ...

    javascript与actionscript3.0通信实例.rar

    在现代Web开发中,有时我们需要在浏览器端的JavaScript与Flash内容(使用ActionScript编写)之间进行交互,以实现更丰富的用户体验。本教程将深入探讨这两种语言之间的通信机制,特别关注在兼容Firework程序时的实现...

    ActionScript与JavaScript相互调用

    - **最佳实践**:尽管ActionScript与JavaScript之间的相互调用可以实现很多强大的功能,但在现代Web开发中,由于Flash的逐步淘汰,更多地推荐使用HTML5、CSS3和JavaScript等技术栈。 #### 结论 通过上述分析,我们...

    JavaScript和ActionScript的交互实现代码

    总结一下,JavaScript 和 ActionScript 之间的交互是通过 Adobe Flash Player 的 `ExternalInterface` 类实现的。`ExternalInterface.call()` 方法允许 ActionScript 调用 JavaScript 函数,而 `ExternalInterface....

    一个实现ActionScript 与JavaScript 进行相互通信的程序例子

    ActionScript主要用于创建富媒体内容,而JavaScript则广泛应用于网页动态效果和用户交互。当需要在Flash内容与网页之间进行数据交换时,就需要实现ActionScript与JavaScript之间的通信。本程序例子旨在展示这种跨...

    javascript与flash之间的交互(例子)

    JavaScript 可以通过这些对象的属性和方法与 Flash 进行交互,如 `getVariable` 和 `setVariable` 方法。 3. **Flash 发布设置**: 为了使 Flash 能够与 JavaScript 通信,需要在 Flash 的发布设置中启用 "Allow ...

    javascript和actionscript之间通信实例

    7. **Adobe AIR Native Extensions (ANE)**: 对于桌面应用程序,Adobe AIR允许创建Native Extensions,将ActionScript与操作系统级别的API连接起来,JavaScript可以通过ANE与ActionScript交互。 8. **PostMessage ...

    javascript与flex交互

    ### JavaScript与Flex交互知识点 #### 一、简介 在Web开发领域中,JavaScript与Flex的交互是一个非常实用且重要的技术组合。Adobe Flex是一种用于构建和部署丰富的互联网应用程序(RIA)的强大框架,它支持多种...

    js.rar_actionscript_flash js_js actionscript_js flash_js交互

    "js.rar_actionscript_flash js_js actionscript_js flash_js交互"这个标题揭示了我们要探讨的主题——如何实现JavaScript与Flash ActionScript之间的交互。 ActionScript是Adobe Flash Professional中的主要编程...

    flex和javascript交互例子

    在Flex中,我们可以使用`ExternalInterface`类来与JavaScript进行交互。`ExternalInterface.addCallback`方法允许我们在JavaScript中调用Flex组件的方法,而`ExternalInterface.call`方法则用于在Flex中调用...

    Flex3与javascript相互交互验证

    Flex3与JavaScript之间的交互验证是Web开发中的一个重要概念,它允许Adobe Flex应用程序(基于ActionScript 3)与网页上的JavaScript代码进行通信。这种交互性极大地增强了富互联网应用(RIA)的功能,使得Flex组件...

    ActionScript与JavaScript相互调用(论文)

    ### ActionScript与JavaScript相互调用 #### 摘要 随着网络技术的发展,网页互动性的增强变得至关重要。本文探讨了如何在ActionScript与JavaScript之间实现相互调用,并借此完成一些单靠任何一种语言都无法实现的...

    Javascript,Actionscript3,css2,DHTML,JDOM,JQuery API开发文档打包下载

    这些文件包含了多个重要的IT技术领域的开发文档,涵盖了从前端到后端的重要编程语言和技术,包括JavaScript、ActionScript 3.0、CSS2、DHTML、JDOM以及jQuery API。接下来,我们将逐一深入探讨这些知识点。 1. **...

    JavaScript与ActionScript3两者的同性与差异性

    总结来说,JavaScript 和 ActionScript3 虽然共享 ECMAScript 标准,但在应用场景、对象模型、运行环境和 OOP 支持等方面存在显著差异。随着技术的发展,JavaScript 已经成为 web 开发的主流,而 ActionScript3 在...

    Flex与JS交互

    这种交互性极大地扩展了富互联网应用(RIA)的功能,使得开发者能够利用Flex的强大图形和动画能力,同时利用JavaScript与网页环境的紧密集成。 ActionScript是Flex的核心编程语言,它是基于ECMAScript的一个方言,...

    FLASH与JAVA的交互

    - **Flash External Interface (FEI)**:Flash Player允许ActionScript代码通过ExternalInterface API调用JavaScript函数,进而与网页中的Java代码进行交互。这种方式适用于浏览器环境,Java可以通过JavaScript操作...

    actionScript 3 API

    在AS3中实现JavaScript与ActionScript的双向通信通常通过`ExternalInterface`类完成。这个类允许AS3代码调用JavaScript函数,并接收JavaScript回调。这对于网页集成Flash内容时的数据交换至关重要,例如实现动态内容...

Global site tag (gtag.js) - Google Analytics