上一篇说到的中文输入法的捕获方法,还存在一些缺陷:

  1. 在中文输入法下,按一些符号键,如逗号、句号等按键的时候,虽然没有显示输入法的输入窗体,但是依然不会触发 keypress 事件,并且其 keydown 的键码都是 229, 不能正常输入。
  2. enter、空格、删除、tab、shift、ctrl、上下左右等按键事件也没有处理。
  3. 光标的位置没有处理。
  4. FF 中文输入法下,仅会在第一个键触发 keydown, 并且 code === 0, 结束中文输入的时候,会再触发一次结束中文输入的这个键的 keyup

下面记录一下上面几个问题的解决思路:

  1. 需要统一在 keyup 的时候监测 keycode, 如果是符号键的操作,那么就触发从 textarea 读取内容填充到 content 的操作。这样还有一个缺陷,连续按住一个符号键不放开,只有当放开的时候才会触发输入。
  2. 在 keydown 的时候,检测 keycode, 如果是在这些特殊键码以内的按键,则分配相应的事件处理函数。
  3. 把光标的位置 curPos 保存到 zEditor 命名空间的全局。每一次有改变内容或者点击的操作的时候,就重置 curPos

如何获取光标位置呢?思路如下:

  1. 开始 content 内容为空,这时候点击 content 区域,就创建一个带有唯一 name 的 p 标签,同时增加两个属性:一个是光标在这个 p 的标志 'cur'=1, 一个是当前光标在这个 p 的索引 'curIndex'=0. p 的每一个文本都由 span 包裹,这样可以在点击的时候,获得到这个被点击的 span 是 p 的第多少个子元素,计算出 curIndex 的值。
  2. 每输入一个文字,就把 curIndex++ 删除一个就 curIndex--
  3. 点击文本区的时候,把点击的 p 加属性 'cur'=1, 其他的移除。然后算出点击的 span 在当前 p 的索引,加到当前 p 的 curIndex
  4. 做一个函数,根据 p 的 curIndex 算出光标应该在的位置,然后把光标挪过去。
  5. 关于点击 span 的时候,获得 curIndex, 有一些重要的地方记录下:比如我点的这个 p 的没有输入内容的部分,也就是没有文字的地方,这个时候应该把光标置于当前 p 的末尾。点击 content 没有输入内容的部分,应该把光标置于最后一个 p 的末尾部分。

如何判断点击位置呢,聪明的小伙伴们都想到了 event.target, 借助 jQuery 的淫威:可以获得 tagName = ev.target.tagName.toLowerCase(); 如果是 span 表明点击在文本区,正常赋值、计算。如果是 p 表明点击在 p 的空白区,将光标置于该 p 的末尾。如果是 div 表明点击在 content 的空白区,将光标置于最后一个 p 的末尾,齐活 ~

咦,不对。还有几件事情没做:

  1. 键盘操作,比如上下左右还木有…
  2. 行号呢?行号还木有啊混蛋…
  3. 还不能格式化文本啊,这叫神马尼玛的富文本编辑器啊?难道要我审查元素修改输入内容么…
  4. 我觉得这玩意做着做着要做成代码编辑器了…开始想如何加代码高亮了…
  5. IE 我是打算放弃了,为毛 textarea 设置了透明,光标却还显示…
  6. FF 还有些小毛病..

继续折腾 ing…