搜狗云输入法JS文件剖析(三)

这篇主要分析imeBindInput函数。

现在才发现,网上的解压代码有些问题,由于我没研究过代码的压缩算法,对于解压也不是很熟悉,所以暂时没精力去精确还原全部代码,既然这篇文章分析的是imeBindInput函数,那么就直接从内存里面把代码请出来吧:

imeBindInput

先从大局入手:

image

可以看出,绑定的地方有:
1.type=text的输入框
2.textarea
3.iframe

另外对顶层元素(这里是document)进行事件绑定:

1.如果是标准浏览器则绑定keydown/mousedown
2.如果是ie浏览器则追加activate事件
3.其它的则仅仅追加mousedown事件

PS:这个函数采用了try语句,看来作者对这一块操作也不是很有信心啊,呵呵~~

先来看看最简单的text输入框是怎么绑定事件的吧。

Code

首先对输入框追加imebind属性
接着讲输入框的键盘、焦点、点击事情全取消了(仅仅针对<span click=”…”>click me</span>这种写法),至于为什么,我也没法理解,感觉这样不是改变了原有元素事件了吗,吃力而且不讨好。
最后又是根据不同的浏览器器进行事件绑定,按理说应该对此进行封装,但是没有办法,针对IE又特殊照顾了一下(先detachEvent删除了事件),至于为什么,再次无法理解,看来自己在事件绑定方面的能力太差了,比如说分不清b[i].onkeyup = null和b[i].detachEvent("onkeyup", b[i].onkeyup); 的区别。

好吧,先稍微总结一下。主要对输入框进行三项事件绑定:
keyup=>imeInput
keydown=>imeKeyDown
keypress=>imeKeyPress

- 呃,干嘛keyup对应的不是imeKeyUp?

接下来是textarea元素,按理说区别应该是回车的处理。
大概扫了一眼,发现代码是和text输入框一样的,也是绑定了三个事件。

最后是iframe的绑定,这时候主要就是利用imeBindInput对自身的递归调用了。


对这代码有些无语,但为了执行速度,也只好这样了。
要是我就写成:

OK,现在回来总结一下。

这个函数主用用于对参数(一开始为document)底下(包括iframe)的普通输入框(type=text的input和textarea)进行三个键盘事件绑定(keyup/keydown/keypress),最后对参数的keydown/mousedown/activate事件进行绑定(IE绑3个,标准的绑2个,其它的绑一个 - 有些复杂啊~~~)

posted @ 2009-11-29 17:53  小黑  阅读(525)  评论(0)    收藏  举报