说之前先说下KISSY.Flash的任务目标:
- 支持多SWF管理。
- 支持动态、静态两种方式获取SWF。
- 对第三方参数 flashvars的值进行有向过滤(动态)。
- 支持第三方参数flashvars的内容,深度大于1。
- 支持第三方参数flashvars深度大于1的内容JSON串化。
- 支持在线安装最新的flash播放器。
- 对不支持开发者期望版本的客户端提供具体的错误参考。
再说说这个库的构成。
- flash.js 对KISSY抽象资源做了约定,便于未来的更改升级,并确立了 KISSY.Flash的命名空间。
- flash-embed.js 当前 KISSY.Flash 具体逻辑和功能的实现主体。
- flash-ua.js 针对KISSY.UA的扩展,提供对客户flash播放器版本判断以及开发者期望运行版本检测。
此次主要说的是第一条关于SWF多条管理的抽象资源 flash.js。
看第一次代码:
KISSY.add('flash', function(S){
S.Flash = {
instances: { }, //存储每个已获取到的 swf 的 html元素
archives: [] //存储每个swf的id
};
});
当初这样的设计是为了能对 swf进行通过序列操作,并能获得附加SWF个数统计,以及快速的对象获取。
而且当初设定了 KISSY.Flash 就是个静态对象,因此对 swf个数的获取需要动态的。
而之后的从简单和容易记的角度上来考虑,于是觉得 用 swfs 代替 instances和 names 代替 archives 更好的从字面理解存在的意义和便于记忆。
KISSY.add('flash', function(S){
S.Flash = {
swfs: { },
names:
};
});
后来,玉伯同学说既然获取/操作swf都需要id,且并以此作为swfs的key,不如就直接将names称为ids。
看上去是个好主意,于是又有了
KISSY.add('flash', function(S){
S.Flash = {
swfs: { },
ids:[]
};
});
心想,这应该完美了吧,但事实上世界本就无完美,如人无完人一样。
在实际操作过程中真正通过 index搜寻 swf的用途很少,而开发人员往往在一开始就可以预定id。
KISSY的原则就是2/8原则,只挑最好的,不挑最少的。
因此再三考虑决定废弃 ids这个数组对象。
但是问题来了,没有了数组,我们就无法动态获取SWF个数,而具体的实现要在后续的 flash-embed.js中实现。
于是根据抽象资源提供基本接口的约定,因此决定向swfs中加入length属性,通过 后续的增删操作提供增减操作。
而当时想到的是 swfs既然是个类 list 应该具备 length 属性,于是又有了以下代码:
KISSY.add('flash', function(S){
S.Flash = {
swfs: {length: 0 }
};
但是,总觉得这样写风险还是很大,比如某个 swf的 id 就叫 length。于是在存储规则中增加了一条规则:每个id都具有 “#”前缀。
这样就不会有污染,而且ID前带 “#”符合了 KISSY的DOM 选择器规则。这看起来很完美了。
可实际在做KISSY.Flash扩展的时候,问题又来了,由于swfHTML元素的id决定了as调用swf 唯一性,而这样的更改必然会对后续的操作带来一些工作。
比如正则处理ID。
但这样做又违背了 KISSY中的 一个S ------简单。
于是基于以下两点考虑最终让此静态抽象资源对象走向了最“幸福”的一站:
- swfs应该是个池,而且是应是个纯粹的“一一对应池”。
- 既然Flash就是个静态抽象资源对象,且管理多个实例,其本身也类似 collection ,更何况后续会有 add/remove/get,因此应该用最方便最易解的length。
于是。。。。事情就是那么简单。。。。。简单就是美嘛。。。。
KISSY.add('flash', function(S){
S.Flash = {
swfs: { },
length: 0
};
这样的好处可以直接通过 S.Flash.length获取到 Flash的个数。而之前则为了达成 获取 Flash中 SWF的个数采用了 length()或len()去获取S.Flash.swfs.length。
总结:
事实上,我们在做开发的时候应该遵从第一直觉,既为了达成某项目标,其惯例或者说约定成俗的方式是什么。而理性往往不一定是对的,就好像对swf的个数统计就应该源于 swfs。但事实上作为使用者来说,更倾向于“我给谁了就向谁拿”的习惯,因此基于这2点 将 length作为属性直接写在静态抽象资源类上更适合不过了。
下一篇我将会隆重的介绍 KISSY.Flash 具体使用方式和过程。
KISSY Flash源码 :http://github.com/kissyteam/kissy/tree/master/src/flash/
KISSY Flash文档 : http://kissyteam.github.com/kissy/docs/flash/index.html