- 在线时间
- 32 小时
- 专家
- 0
- UID
- 346168
- 注册时间
- 2007-4-9
- 帖子
- 68
- 精华
- 0
- 积分
- 151
- 离线
- 360 天
- 帖子
- 68
- 体力
- 294
- 威望
- 3
|
发表于 2007-7-11 11:18:06
|显示全部楼层
”ExternalInterface 类是外部 API,在 ActionScript 和 Flash Player 的容器之间实现直接通讯的应用程序编程接口,
例如,含有 JavaScript 的 HTML 页。 推荐对所有 JavaScript 与 ActionScript 之间的通信使用 ExternalInterface。
在 HTML 页中使用 JavaScript,可以调用 Flash Player 中的 ActionScript 函数。 ActionScript 函数可以返回一个值,JavaScript 会立即接收它作为该调用的返回值。
此功能替代了较旧的 fscommand() 方法。“ ——摘自 <ActionScript 3.0 语言和组件参考 - ExternalInterface >.
我根据官方文档稍稍改变和注释,为你解释如何使用ExternalInterface。
实例:http://221.174.21.80/temp/ext/ext.html
打包下载:
ExternalInterface
一个重要属性:available : Boolean 见下边代码的粗体显示“point 1”
[static] [read-only] 指示此播放器是否位于提供外部接口的容器中。
注意:将 External API 与 HTML 一起使用时,应始终在尝试调用任何 JavaScript 方法之前先检查 HTML 是否已完全加载。
两个重要方法:addCallback(functionName:String, closure:Function):void 见下边代码的粗体显示“point 2”
[static] 将 ActionScript 方法注册为可从容器调用。
SecurityError &mdash 包含环境属于调用代码无权访问的安全沙箱。 修正此问题:
在包含 HTML 页中的 SWF 文件的 <object> 标签中,设置以下参数:
<param name="allowScriptAccess" value="always" />
在 SWF 文件中,添加以下 ActionScript:
flash.system.Security.allowDomain(sourceDomain)
call(functionName:String, ... arguments):* 见下边代码的粗体显示“point 3”
[static] 调用由 Flash Player 容器公开的函数,不传递参数或传递多个参数。
//------------------------------ExternalInterfaceExample.as------------------
package ext{
import flash.display.Sprite;
import flash.events.*;
import flash.external.ExternalInterface;
import flash.filters.GlowFilter;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFieldType;
import flash.utils.Timer;
public class ExternalInterfaceExample extends Sprite {
private var input:TextField;
private var output:TextField;
private var sendBtn:Sprite;
public function ExternalInterfaceExample() {
//-----------------初始化UI------------start--------------
input = new TextField();
input.type = TextFieldType.INPUT;
input.background = true;
input.border = true;
input.borderColor = 0x7f9db9;
input.width = 274;
input.height = 20;
input.x = 8;
input.y = 16;
addChild(input);
sendBtn = new Sprite();
sendBtn.mouseEnabled = true;
sendBtn.x = input.width + 8 + 6;
sendBtn.y = 16;
sendBtn.graphics.lineStyle(1, 0x7f9db9, 1);
sendBtn.graphics.beginFill(0xCCCCCC);
sendBtn.graphics.drawRoundRect(0, 0, 140, 20, 0, 0);
sendBtn.graphics.endFill();
//添加发送事件
sendBtn.addEventListener(MouseEvent.CLICK, clickHandler);
addChild(sendBtn);
var label : TextField = new TextField();
label.text = "发送数据到JS";
label.autoSize = TextFieldAutoSize.LEFT;
label.x = sendBtn.x+ Math.round((sendBtn.width - label.width)/2);
label.y = sendBtn.y;
label.selectable = false;
label.mouseEnabled = false;
addChild(label);
this.graphics.lineStyle(1, 0x7f9db9, 1);
this.graphics.moveTo(8, 40);
this.graphics.lineTo(428, 40);
this.graphics.lineTo(428, 203);
this.graphics.lineTo(8, 203);
this.graphics.lineTo(8, 40);
output = new TextField();
output.y = 40;
output.x = 10;
output.width = 420;
output.height = 160;
output.multiline = true;
output.wordWrap = true;
output.textColor = 0x00ff00;
output.filters = [new GlowFilter(0x000000, 0.8, 2, 2, 8, 3)];
output.text = "初始化...\n";
addChild(output);
//-----------------初始化UI---------end-----------------
//指示此播放器是否位于提供外部接口的容器中。 如果外部接口可用,则此属性为 true;否则,为 false。
if (ExternalInterface.available) { //point 1
try {
//对JavaScript开放一个方法;
ExternalInterface.addCallback("sendToActionScript", receivedFromJavaScript); //point 2
if (checkJavaScriptReady()) {
output.appendText("JavaScript is ready.\n");
} else {
//如果JavaScript is not ready,新建一定时器,没0.1秒检测一次,直至JavaScript is ready;
output.appendText("JavaScript is NOT ready, 0.1秒后重试.\n");
var readyTimer:Timer = new Timer(100, 0);
readyTimer.addEventListener(TimerEvent.TIMER, timerHandler);
readyTimer.start();
}
} catch (error:SecurityError) {
output.appendText("A SecurityError occurred(安全错误): " + error.message + "\n");
} catch (error:Error) {
output.appendText("An Error occurred(错误): " + error.message + "\n");
}
} else {
output.appendText("External interface不可用。");
}
}
/**
* 对JavaScript开放的名为sendToActionScript的方法。
* 在JavaScript中这样调用:.sendToActionScript(instring),
* instring就传给本方法的value了。
*/
private function receivedFromJavaScript(value:String):void { //point 2
output.appendText("JavaScript 说: " + value + "\n");
}
/**
* 调用JavaScript暴露的方法 isReady
*/
private function checkJavaScriptReady():Boolean {
var isReady:Boolean = ExternalInterface.call("isReady"); //point 3
return isReady;
}
private function timerHandler(event:TimerEvent):void {
output.appendText("检查 JavaScript 状态...\n");
if (checkJavaScriptReady()) {
output.appendText("JavaScript is ready.\n");
Timer(event.target).stop();
}
}
/**
* 鼠标点击发送时, 调用JavaScript暴露的方法 sendToJavaScript
*/
private function clickHandler(event:MouseEvent):void {
if (ExternalInterface.available) {
ExternalInterface.call("sendToJavaScript", input.text); //point 3
}
}
}
}
//------------------------------------ext.html---------------------------------------------
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>ExternalInterface实例</title>
<style type="text/css">
body {
background-color: #FFF;
font-family: "Arial", "宋体";
}
</style>
<script type="text/javascript" src="swfobject.js"></script>
<script language="JavaScript">
var jsReady = false;
//暴露给ActionScript的方法
function isReady() {
return jsReady;
} // point 3
function pageInit() {
jsReady = true;
document.forms["form1"].output.value += "\n" + "JavaScript is ready.\n";
installOK();
}
function installOK(){ //此处使用了SWFObject,如有不懂可看 http://www.awflasher.com/flash/articles/swfobj.htm
var so = new SWFObject("Ext.swf", "Ext", "430", "220", "9", "#FFF");
so.addParam("quality" , "high");
so.addParam("allowScriptAccess" , "sameDomain");
so.write("icenter");
}
function thisMovie(movieName) {
if (navigator.appName.indexOf("Microsoft") != -1) {
return window[movieName];
} else {
return document[movieName];
}
}
//调用ActionScript暴露的方法sendToActionScript
function sendToActionScript(value) {
thisMovie("Ext").sendToActionScript(value);
}
//暴露给ActionScript的方法
function sendToJavaScript(value) {
document.forms["form1"].output.value += "SWF 说: " + value + "\n";
} // point3
</script>
</head>
<body onload="pageInit();">
<div id = "iall">
<div id="icenter"></div>
<div id="iform">
<form name="form1" onsubmit="return false;">
<input type="text" name="input" size="40" value="" />
<input type="button" value="发送数据到SWF" onclick="sendToActionScript(this.form.input.value);" /><br />
<textarea cols="50" rows="10" name="output" readonly="true">初始化...</textarea>
</form>
</div>
</div>
</body>
</html>
[ 本帖最后由 alvas 于 2007-7-11 11:24 编辑 ] |
附件: 你需要登录才可以下载或查看附件。没有帐号?注册
-
总评分: 威望 + 2
查看全部评分
|