昨日,土豆的前端开发人员们就事件侦听之间是否应该出现逻辑关联展开了一场辩论。具体争论的问题如下:
document.body.addEventListener("click", functionA, false);
document.body.addEventListener("click", functionB, false);
functionA() {
document.body.removeEventListener("click", functionB, false);
}
functionB() {
}
此时如果我在页面的body上点击了一下,会发生什么?回答有两种:A和B都执行、但下一次点击B不会再被执行了;A执行B不被执行、且以后B都不会执行。
答案是什么并不重要,关键是要看浏览器的js引擎如何处理事件侦听。分别假设上面两种答案都是正确的话,那么它们各自的处理方式应该如下:
- 点击触发后,A和B方法同时收到侦听并触发,此时它们是并行的。因此都会产生调用并存入内存队列中,等待出列执行。
- 点击触发后,A由于先注册所以先触发侦听,B完全没有任何反应,此时它们是串行的。因此A先进入队列,执行过程中移除了B的侦听,B也就永远销声匿迹了。
那么我们常见的浏览器中的js引擎都是如何实现的呢?因为js是函数式单线程的,所以正确答案是第2个。但是包括标准推荐的做法在内,我的观点是不应该在事件侦听中出现逻辑关联,也就是耦合。
如果两个事件侦听出现了依赖逻辑互相确定执行的话,那么它们本身就应该写在一个事件侦听里面,然后通过重构相分离。依然以上面的为例,B方法的执行依赖于A方法中的某个逻辑的话,更好的做法应该是这样:
document.body.addEventListener("click", listener, false);
function listener() {
if(A()) return;
B();
}
functionA() {
if(/*某个条件达成*/) return true;
return false;
}
functionB() {
}
如果出现了不同事件侦听有逻辑关联的情况的话,那么最初的设计可能就需要考虑一下。反对者(其实就是指某人)的论据则是灵活度以及js的函数式和单线程特性。在日益复杂的情势中,前端是否也应该像java摒弃多继承一样,而降低某些灵活度呢?
Tags: 事件侦听
as3和java互相通信,这是现在经常能看到的一种方式了。很多大型应用、富客户端和服务器通信、webgame等,基本上都选择了这一组合。
这几天我在研究as3和java的socket通信时,遇到了点问题,后来结果证明,我是杞人忧天了……
socket通信as3和java都有比较底层的api可以使用,比如传输byte流。我们可以通过对一个字符串编码进行实验:
String s = "army阿米";
byte[] b = s.getBytes("UTF-8");
var s:String = "army阿米";
var ba:ByteArray = new ByteArray();
ba.writeUTFBytes(s);
值得一提的是,as3默认编码就是UTF-8,这点无需关心;java的默认编码和操作系统平台有关,比如我的机子默认是GBK编码,如果要和as3保持一致,就得在读取时手动指定。如果不知道默认编码是什么,可以通过FileWriter.getEncodeing()方法来取得。
这两种语言在编码的结果上是一致的(废话,编码可是个标准),但是在显示方面就不一样了,这也导致我郁闷了半天为何显示结果不相同?
1100001
1110010
1101101
1111001
11101001
10011000
10111111
11100111
10110001
10110011
以上是最终存储的结果。但是问题来了,as3的ByteArray类用来存储字节,其中每个字节是无符号的;java中byte却是有符号的,它的最高为用来表示正负。因此打印的时候一个是正数(范围0到255),另外一个就变成了负数(范围-128到127)。
Tags: byte编码
Sun被Oracle收购后,停掉了不少开源项目,其中就有我关心的《Project Darkstar》。今日突发奇想又登录了下老的网站主页,发现关闭之后多出了一个链接:
http://www.reddwarfserver.org/。
哦也,开源之火生生不息!目前的0.10.0版本其实就是Project Darkstar停之前最新的发布版本。期待你的表现,某人赶快给我研究去……嘿嘿……
这是由Dexter同学厚积薄发的作品,分为第三方类库、核心、输入输出、视图、界面组件、工具以及插件等几大部分。

Tags: tui
http://code.google.com/p/jacld/
预览地址:http://jacld.googlecode.com/svn/trunk/bin/index.html
JAcld(Javascript & Actionscript CapsLock Detection)是一款基于as和js的大写锁定检测工具,大小只有1k多,作用于web上。
今天终于搞定了针对webkit的特殊修正,所以目前主要浏览器都能使用了。不过还有2点遗憾:
- webkit由于flash的聚焦bug,无法通过flash检测,因此使用了js检测。它跟flash相比起来体验方面要稍微差一点。
- ie下亦存在聚焦问题,当使用tab键切换focus到输入框上时,有一定几率聚焦失败。
综合而言beta1倒是可以尝试使用的。谁能研究出搞定那2个bug的方法就谢天谢地了……
Tags: JAcld