ActionScript3注入JavaScript脚本

ActionScript3注入JavaScript脚本
[url=http://www.actionscript.org/resources/articles/745/1/JavaScript-and-VBScript-Injection-in-ActionScript-3/Page1.html]JavaScript and VBScript Injection in ActionScript 3[/url]主要内容摘抄

脚本注入在这里是说在ActionScript3编程时更好的组织和使用JavaScript,不是黑客攻击做的那个。通过ActionScript3的ExternalInterface类完成,需要了解JavaScript和文档对象模型( DOM )。

[b]简介[/b]
比如说现在用ActionScript3通过socket取数据,然后以JavaScript写到页面上去(我不想用FLEX组件了),这时会用很多现成js组件库,还有自己写的js组件扩展,如何更好的管理它们呢?

通过ActionScript3注入脚本提供以下好处:

[u]服务器独立[/u]:JavaScript编译到SWF文件里了,相对于使用了一个swf,它要用的js文件在另一台服务器上,升级等一些事情会省心。
[u]脚本代码保密[/u] :JavaScript存储在SWF内,不像通常那样直接被看到源代。
[u]透明[/u] :通过适当的编写,只在用到时注入,不用时回收,节约资源。匿名运行,不会影响已有js, 除非你想。
[u]运行脚本的修改[/u] :脚本就像字符串参数一样,在运行时根据具体需求改变。
[u]压缩[/u] :JavaScripts可利用SWF压缩:例如一个32K的JavaScript文件时,存储在SWF里只有5K 。
对于需要Flash/的Flex与JavaScript交互的用户,这是一个不错的解决方案。

[b]AS3脚本注入基础,这是一些常见用法[/b]:
ExternalInterface.call("alert", "foo")

ExternalInterface.call("alert('foo')")

ExternalInterface.call("function(){alert('foo'); alert('bar');}")

var js:String = "function(){function myFunc(str){alert(str);};myFunc(Foobar);}";
ExternalInterface.call(js)

原来我以为http://code.google.com/p/flex-iframe/这外开源项目用的已经很好了。
[b]还有更好的:用XML在AS3中嵌入JavaScript[/b]

import flash.external.ExternalInterface;
var myJavaScript:XML =
<script>
<![CDATA[
function(){
var Foobar = 'foo';
function myFunc(str){
alert(str);
};
myFunc(Foobar);
}
]]>
</script>
ExternalInterface.call(myJavaScript); 这样写JS漂亮多了。

[b]下面是一些更深入的研究,我没试过,从原文抄来的。[/b]

import flash.external.ExternalInterface;
var myJavaScript:XML=
<script>
<![CDATA[
function(){

// 本地变量
var myLocal = 'foo';

// 全局变量
myGlobal = 'bar';
}
]]>
</script>;

因为“var”被省略,myGlobal变成全局的,可以改变网页上js文件里写的一些变量值了。

import flash.external.ExternalInterface;
var myJavaScript :XML =
<script>
<![CDATA[
function(){

// 命名的本地函数,不保存
function myLocalFunction(){
alert('foo');
}

// 匿名的本地函数,不保存
var myOtherLocalFunction = function(){
alert('bar');
}

// 全局函数,可能会覆盖原有函数
myGlobalFunction = function(){
alert('Yo global dude!');
}
}
]]>
</script>
方法和变量效果一样,下面两者结合的例子:

import flash.external.ExternalInterface;
var myJavaScript :XML =
<script>
<![CDATA[
function(){
var snafu = 'You said';
// "Dojo"是被其它脚本创建的全局对象,
// 确认它存在再赋值,避免抛出异常.
// myVar和myFunction会存在对象 "Dojo"中,直到明确摧毁。
if(Dojo){
Dojo.myVar = 'foo';
Dojo.myFunction = function (str) {
alert(snafu + ":" + str);
}
};
}
]]>
</script>
ExternalInterface.call(myJavaScript);

[b]这个XML定义函数被销毁,它保存的变量还在,是一种维护状态的方法,但是要小心内存泄漏和覆盖另一个脚本。[/b]
我们增加了一个新的全局方法,ExternalInterface.call(" Dojo.myFunction","你好") ,将获得一个警告框说: "You said:你好。"

[b]发送参数和返回值:[/b]
import flash.external.ExternalInterface;
var myJavaScript :XML =
<script>
<![CDATA[
function(myFoo){
function myFunc (str){
return str.toUpperCase()
};
var anonResult = myFunc(myFoo);
return anonResult;
}
]]>
</script>
var myResult = ExternalInterface.call(myJavaScript , "foobar");
// myResult is "FOOBAR"

就到这了,如果你关心VBScript,请看原文。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值