WEB开发网
开发学院图形图像Flash js和flash(as3)通信的一种封装思路 阅读

js和flash(as3)通信的一种封装思路

 2012-02-06 12:12:08 来源:本站整理   
核心提示:前一段时间,写了一个播放器的flash组件,这个播放器比较特殊,它本身什么都干不了,需要用js去控制它才能加载并播放音乐,而且可以解析歌词,还有一些其他的功能,例如:输出频谱信息等等.具体可以看这个demo:http://www.html-js.com/mj/version1.0.3/flash/index.html因

前一段时间,写了一个播放器的flash组件,这个播放器比较特殊,它本身什么都干不了,需要用js去控制它才能加载并播放音乐,而且可以解析歌词,还有一些其他的功能,例如:输出频谱信息等等.具体可以看这个demo:

http://www.html-js.com/mj/version1.0.3/flash/index.html

因为组件没完善好,所以请在chrome浏览器查看,其他浏览器可能有bug。

demo里没有显示如何使用频谱信息.

前几天,电脑出了问题,硬盘坏掉了,所以以上的demo和核心组件的代码都被我弄丢了,但是我又实在没有那个精力去重新写了,把一个组件重复写两遍,太没意义.这里只说一下写这个组件时候的思路吧.


  1.一切皆异步
  上次,第五届D2论坛的时候,有一位嘉宾讲过,js中一切皆是异步,所以有人说js程序员是最聪明的程序员,本来,我们都习惯了js的编程方式了,都忘了非异步的语言都是怎么工作的了,其实仔细想想,自己真的聪明的要命,好吧,自嘲一下,但是,有一天,我跟同事聊ruby,同事说为什么很多人说ruby很优雅,我说因为写ruby就像写作文,写js就像超现实主义,写ruby的时候,你想到一条逻辑,那么你就按照你想的表达出来,甚至你可以随便写一个方法名,指不定ruby中就有这个方法,这种情况在ruby中很常见,同时它的逻辑处理也是顺行的,例如循环处理一个数组,ruby中这样写:数组.each |找到的一个元素| 去干点什么事 end.但是在js中就要用一个for来循环,其实这样是不符合语义的,一般的框架中都会封装一些类似each的方法,其实也是对js的一种改进.

一堆废话后,还是回来吧,其实js和flash的通信的场景类似js用socket和服务器的通信,他们有这些共同点:

通信都是持久的,js和flash的通信实际上不是任何一方突然发起的,而是在flash创建的时候就已经有一条桥梁搭建在他们之间,任何一方都可以发起通信.
通信都是异步的,你不知道什么时候flash会突然发起一个通信给js.
  2.封装成事件吧!
  下面来研究下,如果一个js和flash通信互相操作,都会有哪些场景:其实无非三种:

js发一个命令给flash,flash执行操作.(js控制播放器的播放,暂停)
  flash主动发一个请求给js,js执行操作,不过js并不知道flash什么时候会发这个请求.(在特定的时刻flash返回歌曲的加载信息长度信息频谱信息等)
js发一个请求给flash,flash去执行操作,可能过了一会之后,计算出一个结果来,把这个结果返回给js(js里调用一个方法去问flash现在歌曲播放到哪里了,flash获取到位置后,返回给js,js显示在页面上)
flash发送请求给js?这个情况一般不会出现,忽略
看起来挺复杂,但是,其实,我希望,我能很方便地使用这三个功能,例如:

如果我要让播放器播放音乐,我希望这样去控制它:MusicIt.go("play"),假设MusicIt就是最后封装出来的js对象,其中go方法用来向flash发送命令,参数就是命令的名字,例如:MusicIt.go("pause"),MusicIt.go("stop")
如果我要监听flash中发给js的请求,我希望这样,在flash被初始化之前,我就给flash发回的各种事件绑定事件

  源自:http://www.html-js.com/?p=1105

Tags:js flash as

编辑录入:coldstar [复制链接] [打 印]
赞助商链接