zEditor 可划线批注的富文本编辑器(二)
上一篇说到的中文输入法的捕获方法,还存在一些缺陷:
- 在中文输入法下,按一些符号键,如逗号、句号等按键的时候,虽然没有显示输入法的输入窗体,但是依然不会触发 keypress 事件,并且其 keydown 的键码都是 229, 不能正常输入。
- enter、空格、删除、tab、shift、ctrl、上下左右等按键事件也没有处理。
- 光标的位置没有处理。
- FF 中文输入法下,仅会在第一个键触发 keydown, 并且
code === 0
, 结束中文输入的时候,会再触发一次结束中文输入的这个键的 keyup
下面记录一下上面几个问题的解决思路:
- 需要统一在 keyup 的时候监测 keycode, 如果是符号键的操作,那么就触发从 textarea 读取内容填充到 content 的操作。这样还有一个缺陷,连续按住一个符号键不放开,只有当放开的时候才会触发输入。
- 在 keydown 的时候,检测 keycode, 如果是在这些特殊键码以内的按键,则分配相应的事件处理函数。
- 把光标的位置 curPos 保存到 zEditor 命名空间的全局。每一次有改变内容或者点击的操作的时候,就重置 curPos
如何获取光标位置呢?思路如下:
- 开始 content 内容为空,这时候点击 content 区域,就创建一个带有唯一 name 的 p 标签,同时增加两个属性:一个是光标在这个 p 的标志
'cur'=1
, 一个是当前光标在这个 p 的索引'curIndex'=0
. p 的每一个文本都由 span 包裹,这样可以在点击的时候,获得到这个被点击的 span 是 p 的第多少个子元素,计算出 curIndex 的值。 - 每输入一个文字,就把
curIndex++
删除一个就curIndex--
- 点击文本区的时候,把点击的 p 加属性
'cur'=1
, 其他的移除。然后算出点击的 span 在当前 p 的索引,加到当前 p 的 curIndex - 做一个函数,根据 p 的 curIndex 算出光标应该在的位置,然后把光标挪过去。
- 关于点击 span 的时候,获得 curIndex, 有一些重要的地方记录下:比如我点的这个 p 的没有输入内容的部分,也就是没有文字的地方,这个时候应该把光标置于当前 p 的末尾。点击 content 没有输入内容的部分,应该把光标置于最后一个 p 的末尾部分。
如何判断点击位置呢,聪明的小伙伴们都想到了 event.target
, 借助 jQuery 的淫威:可以获得 tagName = ev.target.tagName.toLowerCase();
如果是 span 表明点击在文本区,正常赋值、计算。如果是 p 表明点击在 p 的空白区,将光标置于该 p 的末尾。如果是 div 表明点击在 content 的空白区,将光标置于最后一个 p 的末尾,齐活 ~
咦,不对。还有几件事情没做:
- 键盘操作,比如上下左右还木有…
- 行号呢?行号还木有啊混蛋…
- 还不能格式化文本啊,这叫神马尼玛的富文本编辑器啊?难道要我审查元素修改输入内容么…
- 我觉得这玩意做着做着要做成代码编辑器了…开始想如何加代码高亮了…
- IE 我是打算放弃了,为毛 textarea 设置了透明,光标却还显示…
- FF 还有些小毛病..
继续折腾 ing…