as和js通信

这里将演示的ActionScript和JavaScript的通信,包括ActionScript调用JavaScript的方法,及JavaScript调用ActionScript的方法.

主要用到的是AS2.0里的ExternInterface类.在Flash里调用javascript的方法时使用ExternalInterface.call(),在javascript里调用actionScript 方法时,必须首先在Flash里使用ExternalInterface.addCallback注册方法.

另外一个关键是要把SWF文件放到网页中才行!

先看下效果图,再分析!

效果演示

在这个例子中,网页和SWF中都有一个输入框,和一个发送按钮,用来把SWF中的信息发送到JavaScript,及从JavaScript发送到SWF

SWF容器

JS容器

初始化成功

对ActionScript说:

代码分析

先看SWF里的ActionScript代码

AS Code
import flash.external.*;
// 注册的方法名字,JavaScript将使用这个名字调用
var methodName:String = "send2AS";
var instance:Object = null;
// 实际调用的函数
var method:Function = receiveMsg;
// 返回值表示是否注册成功
var wasSuccessful:Boolean = ExternalInterface.addCallback (methodName, instance, method);
function receiveMsg (msg:String)
{
	info_txt.text += newline;
	info_txt.text += "<font color='#0000FF'>JS</font> <font color='#00FFFF'>" + getDateStr () + "</font> 说:" + newline + msg;
}
// 发送消息
var btnObj:Object = new Object ();
btnObj.click = function ()
{
	sendMsg (send_txt.text);
};
function sendMsg (msg:String)
{
	if (msg != "")
	{
		ExternalInterface.call ("send2JS", msg);
	}
}
var keyObj:Object = new Object ();
keyObj.onKeyDown = function ()
{
	if (Key.getCode () == Key.ENTER && send_txt.text != "")
	{
		sendMsg (send_txt.text);
	}
};
// 获取时间
function getDateStr ():String
{
	var myDate:Date = new Date ();
	return myDate.getFullYear () + "-" + (myDate.getMonth () + 1) + "-" + myDate.getDate () + " " + myDate.getHours () + ":" + myDate.getMinutes () + ":" + myDate.getSeconds ();
}
function init ()
{
	info_txt.html = true;
	if (wasSuccessful)
	{
		info_txt.text = "注册回调函数成功!";
	}
	else
	{
		info_txt.text = "注册回调函数失败!";
	}
	send_txt.text = "";
	send_btn.addEventListener ("click", btnObj);
	Key.addListener (keyObj);
}
stop ();
init ();

要使用ExternalInterface类,必须首先导入它,这里使用的是

AS Code
import flash.external.*;

然后使用ExternalInterface.addCallback方法注册了名字为send2AS的方法,这样JavaScript中就可以使用send2AS调用SWF中实际名称为receiveMsg的方法了,该方法有一个参数,接收传递来的信息.我们把接收到消息显示在一个实例名为info_txt的TextArea组件里.

接下来定义的btnObj是为发送按钮添加事件监听用的,当按下发送按钮时就用ExternalInterface.call调用定义在JavaScript里的名称为send2JS的方法,并传递一个参数.keyObj是为了响应回车事件定义的.

getDateStr是获取本地当前时间的.后面的初始化函数init()也很简单.

SWF里的ActionScript代码就这么多,下面我们看JavaScript函数

JavaScript函数

JavaScript Code
// 定义在网页里用来和SWF交互的JavaScript函数
function send2JS(msg)
{
	receiveMsg(msg);
}
function receiveMsg(msg)
{
	document.getElementById('jstxt').innerHTML += "<font color='blue'>AS</font> <font color='#00FFFF'>" + getDateStr() + "</font> 说:<br />" + msg + "<br />";
}
// 发送消息
function sendmsg()
{
	document.getElementById('as_js').send2AS(document.getElementById('send_txt').value);
}
// 获取时间
function getDateStr ()
{
	var myDate = new Date ();
	return myDate.getFullYear () + "-" + (myDate.getMonth () + 1) + "-" + myDate.getDate () + " " + myDate.getHours () + ":" + myDate.getMinutes () + ":" + myDate.getSeconds ();
}

另外网页中有一个id为jstxt的div,用来显示SWF发过来的消息结果,有一个id为send_txt的文本框,用来输入消息,还有一个发送按钮.

这里的JS函数跟AS很相似,也是这么几个函数,其中send2JS是供AS调用的,receiveMsg就是显示结果.sendmsg是调用SWF里的ActionScript注册的回调函数send2AS,注意,这里的as_js是SWF的在网页里的id.getDateStr就是取得系统时间的.

还有不明白的可以在本页面点右键查看网页源代码,然后分析.

源文件下载

  1. FLA文件:as-js.fla
  2. SWF文件:as-js.swf