ActionScript1/2(ActionScript2只不过是ActionScript1的“编译时”增强版),自1998年至今,已经存在整整十年了。AS2由于初次将OOP(面向对象)的理念引入Flash开发而“一炮走红”。我还记得在2004年的时候大量关于OOP、AS2的讨论涌现出来,也有许多热心人出了不少好书来解释,比如Luar的《AS2与RIA开发》。然而留给人们更多的是无止境的疑问……
随着RIA产品需求的日益复杂化,AS2的弱点在实际应用中一再爆发:丧失了AS1高效灵活的特性不说,事件处理机制完全是一塌糊涂。要不是Macromedia给出的mx.utils.Delegate和mx.events.EventDispather两个类,估计所有的OOP开发者都要吐血而亡。
今天我就被AS2的事件机制给折磨了整整1个小时:有某类VideoItemList引用若干个来自XML数据支撑的VideoItem类,在VideoItem中有按钮响应事件需要调用外部的JavaScript函数,并传递本类(VideoItem)的唯一标识符。本来可以在VideoItem类中直接完成,但为了将接口“完美地”提供给另一名开发工程师,我不得不将VideoItem类中的onRelease方法代理(Delegate)+广播(Dispatch)出来到VideoItemList中,再作事件广播(Dispatch)。
这下好了,在VideoItemList中addEventListener去“监听”这个事件响应再对外广播。可是,监听到的函数体中的this并不指向VideoItemList类。
我知道肯定有方案可以解决,但我放弃了。我不想把有限而宝贵的时间浪费在这样一个愚昧的ActionScript事件架构上去做无聊的hacking。直接在VideoItem里面进行ExternalInterface去和JavaScript通信,以后再也不做ActionScript2的项目了。
大家一起拥抱ActionScript3吧!
附:给一些抛弃ActionScript2的铁证吧:
以下是我Blog统计到的FlashPlayer9的安装情况,只有不到2%的人使用FlashPlayer8:
即便在教育网这种“角落”(为了某些人某些扯淡的理由,教育网一直不能访问国外网站)8.0也只有3%了:
(数据取样来自华中科技大学BBS白云黄鹤站)