AS3.0


┏━━━━━━━━━━━━━━━━━━┓
┃ 第三部分:ActionScript 3 核心类   ┃
┗━━━━━━━━━━━━━━━━━━┛
================================================
第11章 ActionScript 3 核心类和全局函数
================================================

11.1 ActionScript3 中核心类和函数的变化及原因
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃                                         引用原话:                                                     ┃
┃                                                                                                        ┃
┃   核心类和全局函数是什么?简单地说,就是处于顶级包中的类和函数。从代码编写上说,我们可以在任何地方直   ┃
┃接调用它们,而不需要导入包或写全饰名称。从功能上说,它们是一门编程语言中最基础的类和函数,也是最常用到  ┃
┃的功能;从包路径上说,它们处于顶层,在顶级包 (Top-Level Package)中。                                  ┃
┃                                                                                                        ┃
┃    在ActionScript3中,顶级包已经发生了很大的变动。ActionScript2中我们熟悉的很多全局函数和类,在        ┃
┃ActionScript3中都不再是顶级包中的成员了。比如,getTimer()、setInterval()函数就不再是全局函数,而        ┃
┃MovieClip类、Sound类也已经不再是顶级类。在ActionScript3中,在使用它们之前,必须使用import导入它们所在   ┃
┃的包。                                                                                                  ┃
┃   ActionScript3的核心类有多少?ActionScript2中可以全局访问的类有40多个,全局函数(包括未公开的)有70   ┃
┃个左右;相比之下,ActionScript3处于顶级的核心类只有28个,全局函数仅21个,另加全局常量4个。              ┃
┃   那么为什么会发生这么大的变化呢?                                                                     ┃
┃                                                                                                        ┃     ┃                                                                                                        ┃     ┃                                                                                                        ┃
┃ActionScript 3 中核心类和函数的变化及原因                                                               ┃
┃                                                                                                        ┃
┃    和ActionScript2 中混乱的核心类和全局函数进行比较,就可以明白ActionScript3中不得不进行变革的原因。   ┃
┃   ActionScript2拥有过多的核心类和全局函数,是非常混乱和不成熟的。先说说ActionScript2中类的架构:属于   ┃
┃显示对象的MovieClip、Video、TextField、Button,属于网络API方面的LoadVars、NetConnection、NetStream,属  ┃
┃于绘图方面的一些类,等等,还有一些其他杂七杂八的类都被放在顶级包中。再看看整个系统架构,这些顶级类和相  ┃
┃当一部分非顶级类都是直接继承自根类Object类的。在ActionScript2中,顶级包和flash.*包中总共才69个类,居然  ┃
┃有近三分之一直接放在了顶级包中,近三分之二直接继承根类Object。这样的系统架构是极不优雅的,不利于语言的  ┃
┃进一步完善。                                                                                            ┃
┃   再看全局函数中的不合理之处:getURL()、setInterval()、gotoAndStop()等不应该成为全局函数,而应当分别   ┃
┃归类在网络、工具、视觉元件这样的包中,并划分给特定的类才对。除此而外,还有很多为了和低版本的Flash兼容   ┃
┃而保留的一大堆过时的函数,比如setProperty()等。                                                         ┃
┃                                                                                                        ┃
┃    我们不是苛求前人,说他们的架构设计如何如何糟糕,应当怎样怎样,而是与之比较,明白进步之处,从而对现  ┃
┃有架构有更深的理解和领悟。可以看出,这样混乱的状况已经不能适应语言发展要求的标准,只能推翻它,重新设计  ┃
┃一个科学而优雅的架构。这就是ActionScript3诞生的原因和目标。一旦开始系统架构设计,首当其冲的就是顶级包   ┃
┃中的成员安排。                                                                                          ┃
┃    由于宣布了不与ActionScript2及1兼容,没有了历史包袱,一大堆的过时函数全部淘汰,不合理的顶级类(核心  ┃
┃类)和全局函数都重新进行了划分。一些不合理的全局函数分别放到相应的包(package)中,比如getURL(),就被   ┃
┃ActionScript3中的flash.net包的navigageToURL()替代了;setInterval()函数被放置到了flash.util包中。而不应  ┃
┃放在顶级的一些原核心类在重新调整,也被放到了其它的包中                                                  ┃
┃                                                                                                        ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛


11.2 核心类的数目和列表

核心类:(28个,7类)
根类:Object
语言结构:Class(类)、Function(函数)、Namespace(命名空间)、arguments(参数数组)
基本类型:int(有符整形)、Boolean(布尔)、Number(浮点)、String(字符)、uint(无符整型)
常用复杂类型:Array(数组)、Date(日期)、RegExp(正则)
XML相关类:XML()、XMLList()、Qname()
异常类:Error(异常)共11个异常类
工具类:Math(数学)

全局函数:(6类)
类型转换函数:Array,Boolean,int,Number,Object,String,uint,XML,XMLList
URI编码解码:decodeURI,decodeURICompnent,encodeURI,URIencodeURIComponent
URL编码解码:escape,unescape
判值函数:isFinite,isNaN,isXMLName
字符串转值函数:parseFloat,parseInt
控制台输出函数:trace



================================================
第14章 强大的正则表达式:RegExp
================================================
14.2.2 正则表达式的两个构成部分
简写模式:
var 正则对象:RegExp = /匹配模式/标志位
构造函数模式:
var 正则对象:RegExp = new RegExp(匹配模式,标志位)

匹配模式就是正则表达式,标志位包括五个字母 gimsx

14.3 正则表达式语法
14.3.1 正则表达式中的文字符号
普通文字和符号:A-Z a-z 0-9 以及不是元字符的其它符号
输入Unicode字符时,同String一样,使用\uXXXX 

元字符:三三二三个一(记忆口诀)
三个括号:      {[(
三个匹配次数:   *+? 星加问
两个断言:       ^$ 定头定尾
三个一:        | 选择符 . 模糊匹配 \ 转义

三个括号:
{定义匹配次数
[字符集
(子模式

三个匹配次数:
* 匹配出现0次或多次
+ 匹配出现至少1次或多次

? 匹配出现0次最多1次

两个断言:
^ 在/后出现时为左端断言, /^
$ 在/前出现时为右端断言, $/

三个独立元字符:
| 选择符,匹配时兼容匹配选择符两边的字符
. 模糊匹配,可以代替

不可见字符:比较一些转义的控制字符

14.3.2 正则表达式中的字符集
1.字符集的概念和最简单的字符集形式
[字符集]

字符集用中括号括起来
Unicode字符请使用\uXXXX  四位十六进制Unicode代码输入
如:/g[eo]t,分别匹配get和got,但不会匹配geot,因为字符集只能匹配一个字符

2.连字符在字符集中的运用
[字符-字符]
如:[a-z][A-Z],就是匹配英文字母字符集了


3.取反符号在字符集中的运用
[^字符集]
添加取反符号后,匹配时将忽略字符集中的所有元素

4.字符集中需要转义的特殊字符
\转义符号
常见要转义的字符有三类:
1.字符串: 双引号"  单引号 ' 反斜杠 \
2.正则表达式的源字符
3.字符集中的: [\^-


尽可能将会产生歧义的字符转义


14.3.3 特殊的点号(.)
.号可以替代任意单个字符,作为正则表达式中的模糊匹配字符

1.点号不匹配新行符(\n)
多行字符的模糊匹配中,.号不能匹配\n换行符,要匹配换行符,必须在标志位中使用s

2.尽量少使用点号“.”
只在明确不会模糊匹配时出错的情况下才用.模糊匹配,点号匹配所有的Unicode字符。


14.3.4 选择符
| 对选择符两边的元素作任意匹配。
使用|选择符时,尽可能使用括号将两边的操作数括起来,以方便区别。

14.3.5 括号与分组
() 圆括号将表达式的一部分括起来,就会将这部分定交成组,一旦命名了组,就可以通过“向后引用”来调用它。
它所括起的部分一般用于:
1.和选择符搭配,规定作用于选择符的范围,如/he(got|get)it/
2.和限定符搭配使用,指定匹配的重复次数,如/(get)*/


14.3.6 用正则表达式描述字符串的重复
使用{}定义匹配的重复次数,跟在要重复的表达式或字符后面
{最小出现次数[,最多出现次数]}
还有常用的三个 非显式限定符

*+? 星加问

*  出现0次或多次    等同 {0,}
+  出现1次或多次    等同 {1,}
?  出现0次或最多1次 等同 {0,1}


14.3.7 注意正则表达式的贪婪性和懒惰性
使用*+?{}的时候,正则表达式总是尽可能向右搜寻尽可能多的匹配结果,如果想禁止此贪婪性,可在操作符后加上 ?,迫使程序运行时使用懒惰模式,优先使用左边匹配的第一个结果。


14.3.8 用正则表达式来定位
断言:指定匹配发生的位置
^       匹配字符串起始的位置,一般跟在起始/后,组合成 /^
$       匹配字符串结尾的位置,一般跟在结束/前,组合成$/
\b      匹配字符边界
\B      匹配非字符边界

字符边界指空格的位置,可跟在要匹配的表达式左边或右边


14.3.9 正则表达式的5个标志位。
g   global      全局匹配,尽可能匹配全部结果
i   ignoreCase  不区分大小写匹配
m   multiline   断言控制符,使用后 ^$两个断言符才能生效
s   dotall      匹配换行符标志
x   extended    令正则表达式支持空格,但编译时会自动忽略,增加可视的友好度


14.3.10 正则表达式元字符优先线
优先级顺序从高到低排列

\                       转义符
(),(?:),(?=),[]         分级定义符号,字符集定义符号
*,+,?,{n},{n,},{n,m}    限定符
^,$,\位置定义           位置和顺序
|                       选择符




14.4 正则表达式与字符串的结合使用详解
14.4.1 RegExp的exec()和test()
test方法
var RegExp对象:RegExp = /正则表达式/  或  new RegExp(正则式,标志位)
var String对象:String = 字符;
RegExp对象.test(String对象)

RegExp对象.exec(正则表达式):Array
exec返回一个匹配后的数组


14.4.3 String类的replace()与正则表达式向后引用
()使用子表达式括起的表达式,可以在后边引用 ,使用\n n为索引 从1至99
/\b([a-z]+) \1\b/gi  其中的\1就是引用前面第一个([a-z])

此节部分略过 p245


14.5 常用的正则表达式
此节略 p246-p248



================================================
第15章 XML数据处理 
================================================
一大堆理论

15.4 创建XML对象
15.4.1 使用构造函数创建XML对象
var String对象:String = 字符串
var XML对象:XML = new XML(String对象);
trace(XML对象.属性)


15.4.2 直接使用XML文本创建XML对象
var XML对象:XML = 直接输入XML文本 或换行

或者使用变量的方式

var String对象:String = 字符;
var XML对象:XML = 
<{String对象}>

变量使用{}括起来,其它的与XML普通输入无异



15.5 使用运算符操作XML数据
15.5.1 使用"."与"@" 直接访问、修改、创建和删除XML对象
访问:
var XML对象:XML = XML文本;
trace(XML对象.节点名.子节点名)
trace(XML对象.节点[索引])
trace(XML对象.节点.@属性)
trace(XML对象.节点.@属性[索引])

15.5.2 使用"."与"@"直接修改XML对象
注意:如果存在多个同级元素时,不能直接使用.和@修改,因为返回结果是XMLList对象
XML对象.节点.子节点 = 值  //直接修改节点文本
XML对象.节点.@属性 = 值  //直接修改属性值


15.5.3 使用"."与"@"直接添加删除子元素和属性
注意:如果存在多个同级元素时,不能直接使用.和@修改,因为返回结果是XMLList对象
XML对象.节点.新节点名 = new XML(); //添加一个空白节点
XML对象.节点.新节点名 = 字符串;   //添加一个字符串节点
XML对象.节点.@新属性名 = 值;   //添加一个节点属性

删除节点:
delete XML对象.节点.元素[@属性]

15.5.4 简单方便地搜索XML子元素和属性
trace(XML对象.节点..子节点)  //显示所有同级子节点
trace(XML对象.节点.@*.toXMLString()); //显示所有同级节点中的所有属性值
trace(XML对象.节点.(子节点 < 1000)); //显示节点中所有节点文本大于1000的子节点元素
trace(XML对象.节点.(@属性 == 值));  //显示节点中属性等于值的节点


15.5.5 使用正则表达式或自定义函数搜索XML子元素和属性
自定义函数:
XML对象.节点.(自定义函数(子节点));
function 自定义函数(t:*):Boolean{
        t.length()
        if(t<100000) return true;
        teturn false;
        //自定义函数将根据子节点的数量执行多次
        //自定义函数返回值必须是Boolean
}


正则表达式:
XML对象.节点.(子节点.match(正则表达式));


15.6 用API实现的一些常用XML操作
本节略p264

15.7 XML的命名空间
本节略p265

15.8 XML对象与XMLlist对象
本节略p268



================================================
第19章 网络通信基础
================================================
19.1 ActionScript3网络通信的流程
1.构建通信请求对象(URLRequest)
2.使用通信请求对象,构建URLLoader对象,并发出数据请求
3.数据收到之后,发出完成事件,调用“读取完成“事件的侦听器处理返回的数据


标准的加载方法:
var URL路径:String = "URL地址";
var URLRequest对象:URLRequest = new URLRequest(URL路径);
var URLLoader对象:URLLoader = new URLLoader(URLRequest对象);
提交的数据放在URLRequest对象中,读取到的数据放在URLLoader对象中。

对于URL中的值对操作,要使用URLVariables类处理。
var 值串对象:URLVariables = new URLVariables("name=foo&age=28&sex=male");
var URLRequest对象:URLRequest = new URLRequest();
URLRequest对象.url = "动态网页URL";
URLRequest对象.method = URLRequestMethod.GET; //数据格式
URLRequest对象.data = 值串对象;  //将URLVariables赋给data属性


XML数据:
var XML对象:XML = XML文本
var URLRequest对象:URLRequest = new URLRequest();
URLRequest对象.url = "动态网页URL";
URLRequest对象.contentType = "text/xml";
URLRequest对象.data = XML对象.toXMLString(); //将xml转成文本赋给data属性
URLRequest对象.method = URLRequestMethod.POST;



19.1.2 发出数据请求
发出数据请求,需要按照数据请求对象携带的信息,向指定地址发出请求,这部分由URLLoader对象来完成。
var URLLoader对象:URLLoader = new URLLoader(URLRequest对象);  //定义后立刻发送数据

var URLLoader对象:URLLoader = new URLLoader(); 
URLLoader对象.load(URLRequest对象); //调用URLLoader对象的load后才发送数据


如果有数据返回,数据将放在URLLoader对象的data属性中,dataFormat属性则包含返回数据类型的值
dataFormat属性支持三个常量值:
文本型(URLLoaderDataFormat.TEXT)
二进制(URLLoaderDataFormat.BINARY)
值串对(URLLoaderDataFormat.VARIABLES)

URLLoader对象有6种事件,可以让我们侦听:
load()一调用,就发出 Event.OPEN事件
加载过程中,会发出ProgressEvent.PROGRESS事件,包含下载字节数信息
加载完成,发出Event.COMPLETE
加载完成或者失败之前,会发出HTTP状态事件HTTPStatusEvent.HTTP_STATUS
加载失败,发出IOErrorEvent.IO_ERROR
发现加载内容不合安全规则,发出SecurityErrorEvent.SECURITY_ERROR


19.1.3 侦听器函数
使用标准的DOM3事件侦听器函数即可,根据URLLoader对象的事件进行侦听。



19.3 getURL()的继承人:navigateToURL()
import flash.net.*   //使用前要导入net包
navigateToURL(URLRequest对象:URLRequest[,window:String = null])
URLRequest对象 = 网址
window = 打开窗口的方法 _self _blank _parent _top

标准语法:
var URLRequest对象:URLRequest = new URLRequest(URL地址);
navigateToURL(URLRequest对象,"_blank");

或者

navigateToURL(new URLRequest(URL地址),"_blank");



19.4 提交数据的例子
单纯提供数据,可以用sendToURL(),但一般极少这样使用,而不返回数据。
public function sendToURL(request:URLRequest):void



19.5 简述安全模型
Security.sandboxType 返回当前运行所处沙箱信息
目前Flash支持4种沙箱类型
Security.REMOTE             SWF文件来自网络,并遵守基于域的沙箱规则。
Security.LOCAL_WITH_FILE    SWF文件来自本地,可以读取本地数据,但无法访问网络通信
Security.LOCAL_WITH_NETWORK SWF文件来自网络,可与网络通信,但不能读取本地数据
Security.LOCAL_TRUSTED      SWF文件是本地文件,且已经受到用户信任,此时既可与本地文件通信,也可以与网络通信。

最后一种Security.LOCAL_TRUSTED权限最高,是在Flash IDE环境下测试是所拥有的权限。


19.5.2 跨域文件:crossdomain.xml
一个放置于网站根目录的文件,用于允许被访问的域。
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*" />
<!-- *号定义全域允许 -->
<allow-domain-from domain="*.baidu.com" />
<!--只允许百度的域名访问资源-->
</cross-domain-policy>

更多设置技巧:
http://livedocs.adobe.com/flash/9.0_cn/main/00000349.html

19.5.3
可临时在swf内部设置允许访问的域
Security.allowDomain()  授权访问域
Security.allowDomain(URL域) 
Security.allowDomain("*") 
Security.allowDomain("*.baidu.com") 



┏━━━━━━━━━━━━━━━━━━┓
┃ 第五部分:ActionScript 3 视觉编程 ┃
┗━━━━━━━━━━━━━━━━━━┛
================================================
第20章 ActionScript 3 视觉编程精要
================================================
20.1 什么是显示对象
在舞台上显示的对象,在AS3中统一被称为显示对象(Display Object)
显示对象除了包含能看得见的显示对象外,也包括不能看见但却真实存在的显示对象容器(Display Object Container)


20.1.1 ActionScript3 中显示对象等级结构
舞台(Stage)
当前SWF(文档类或MainTimeline)
容器
显示对象


20.1.2 显示列表:显示对象模型
AS3中所有显示对象归使用显示列表(Display List)的方式进行管理,只有在列表中列出的对象才会在舞台上显示。
显示对象有两种:在显示列表中(on-list)和不在显示列表中(off-list),在显示列表中的对象会被渲染,不在显示列表中的对象依然存在,不被渲染罢了。


20.2 ActionScript3中显示对象的种类
20.1 ActionScript2中的MovieClip
MovieClip是万能的,但缺点是一旦创建,就拥有了一大堆时间轴等属性,非常浪费资源,有时候只将它作为空白容器。
MovieClip的地位在AS3中减弱了很多。


20.2.2 ActionScript3显示对象种类划分:一个统一、两个层次
一个统一,AS3中所有显示对象都统一于DisplayObject类
第一大层次:是否可以接受互动事件,可以接受的,称为 可互动的显示对象(InteractiveObject);
不可以交互的,称为非互动显示对象.

可互动的显示对象(InteractiveObject):指能够接受鼠标单击、键盘敲击等人机交互事件。
位图、形状、视频等就不能接受这些事件,所以归入不可以交互类。

第二大层次:是否可以作为容器,可以容纳其它显示对象的,称为 显示对象容器(Display Object Container)



20.3 显示对象类库架构
以下很好反映了  一个统一、两个层次  这个概念

所有显示对象都是继承自父类DisplayObject这个抽象类,而父类DisplayObject则继承自EventDispatcher类,
说明所有显示对象都能发送事件。

DisplayObject、InteractiveObject、DisplayObjectContainer是显示对象架构中的三个核心对象,
它们都是不能被实例化的抽象类


视觉架构类图:
EventDispatcher(事件类)
           ┃ 
           ┃ 
根类 DisplayObject(抽象类,不允许实例化,只能实例化子类)
           ┃ 
           ┃ 
InteractiveObject(可以交互)━━━━━━   (不可以交互)  ┏ Bitmap(位图) - Shape(容器)
           ┃                                           ┣ Video(视频) - AVM1Movie(AS1.0 2.0影片)            
      ┃                                           ┗ [StaticText(静态文本框)* - MorphShape(形状补间)*]
           ┃                                               有*的为必须在舞台上手动创建
           ┃ 
           ┃ 
DisplayObjectContainer(可以作为容器)  ━  (不可以作为容器) [SimpleButton(简单按钮) - TextField(文本框)]
           ┃ 
           ┃ 
           ┃ 
Sprite(简单容器,简化版MovieClip)   ━━  Stage(舞台) - Loader(加载)
           ┃ 
           ┃ 
           ┣━━━━━━━━━━━━━ mx.core.FlexSprite - mx.core.UIComponent(Flex)
           ┃ 
           ┃ 
           ┗━━ MovieClip(影片剪辑)
                       ┃ 
                       ┃ 
                       ┗━ mx.flash.UIMovieClip




20.3.1 InteractiveObject类和非InteractiveObject类
InteractiveObject类    可以接受人机交互事件
非InteractiveObject类  不可以接受人机交互事件
不可以接受人机交互事件的类中有6个同级对象 :
AVM1Movie、Bitmap、MorphShape、Shape、StaticText、Video

其中再细分  MorphShape 和 StaticText不可以用代码创建
StaticText是Flash编辑环境下用文本工具创建的
MorphShape是在flash中创建形状渐变时自动生成的

AVM1Movie: Actionscript Virtual Machine1(ActionScript虚拟机1),即使用AS1.0 AS2.0创建的Flash影片,
为了向下兼容,当载入使用以上版本AS创建的影片时,会自动创建这个类,以同AVM2区分开来。



20.3.2 容器类和非容器类
第二层是InteractiveObject类的对象
包含三类,使用容器与非容器的概念来区分。
容器:可以在它里面加载其它的DisplayObject的容器
非容器对象:TextField、SimpleButton
TextField就是动态文本框

SimpleButton是Flash API

剩下的就是DisplayObjectContainer(显示对象容器)类,其下有:
Sprite、Loader、Stage
Stage是舞台类
Loader是原有MovieClip中加载外部资源的方法集合。

20.3.3 Sprite 和 MovieClip
Sprite将是我们在AS3中接触最多的容器,可以把它理解成去掉时间轴的MovieClip。
Sprite中含有Graphic对象,可以像MovieClip那样直接在自身绘图,但Sprite不同于Shape,
区别在于Sprite是容器,而Shape不是。

MovieClip是Sprite的子类,只保留了一些与时间轴控制相关的gotoAndStop方法和currentFrame属性等。


20.3.4 非Flash API的几个显示对象类
需要在Flex中使用到的显示对象,必须是UIComponent类的子类或实现IUIComponent的接口(Interface)



20.4 ActionScript3 视觉架构的优越性
20.4.1 更高效的渲染,更好的内存利用
AS3中影片剪辑被弱化成
绘制矢量使用轻量的Shape对象,
需要容器使用轻量的Sprite对象,
降低了时间轴的使用,也同时降低了内存的浪费。


20.4.2 自动化的深度管理
AS3中的显示对象深度由程序自动管理。
每个DisplayObjectContainer实例都有numChildren属性,用于显示对象容器中的子对象数目
显示对象容器列表中对象的索引从0开始,到numChildren-1


20.4.3 完整遍历显示列表
在AS3中,可以访问显示列表中的所有对象,包括使用ActionScript创建的对象及在IDE中绘制的对象。


20.4.4 列表外的显示对象
只有在显示列表中的对象才会被显示在舞台上,添加到显示列表的方法是调用addChild()或addChildAt()


================================================
第21章 DisplayObject类与矢量图、位图
================================================
21.1.1 显示对象的可视属性列表
AS3中所有原有对象的属性前面的下划线都去掉了,直接使用字母 ,比如 _x _y _alpha 之类变成x y alpha
注意的是:
scaleX scaleY alpha 之类原来0-100的值,在AS3中变成了0-1,其中的百分比使用小数
显示对象基本有11个可视属性(共有25个):
x、y、width、height、scaleX、scaleY、mouseX、mouseY、rotation、alpha、visible

21.1.2 显示对象的其它属性
显示对象除了11个可视属性外,还有5个常用属性和9个不太常用的属性。
除此之外,DisplayObject还拥有6个实例方法,能发出6种事件。

5个常用属性:
name:   显示对象名字,与AS2不同的是,创建对象时,name会自动分配
parent: 父容器,指向显示列表的父容器,当显示对象不在显示列表中时,该属性为null
root:   返回当前SWF主类的实例引用。
stage:  舞台
mask:   遮罩,指向用来遮罩的对象。



21.2 所有显示对象的抽象父类:DisplayObject类
DisplayObject类是一个不能被实例化的抽象类,也不能创建直接继承Dis

From http://shang.iteye.com/blog/410389

你可能感兴趣的:(xml,正则表达式,Flex,Flash,actionscript)