HTML在线编辑器的实现难点

作者:heero 来源:heero博客 时间:2010-06-26 12:58:00 

到目前为止,我已经开发了两个HTML编辑器了,一个用在公司的CMS项目,另一个用在这个Blog(TidyEditor,暂时没有单独发布)。下面总结一下开发的难点以及应对方法。

HTML在线编辑器实际上是什么

其实有好几种实现方式,目前用得最多、兼容性最好的还是iframe方式。

<iframe src="" frameborder="0"></iframe>

只有这个空iframe是不行的,还要用Javascript把它设成可编辑:

iframe.contentWindow.document.designMode = "on";
iframe.contentWindow.document.contentEditable = true;

换而言之,HTML在线编辑器就是一个可编辑的iframe

加粗、斜体、下划线、加链接等功能如何实现

浏览器已经提供了实现这些功能的接口execCommand

iframe.contentWindow.document.execCommand(cmd, isDefaultShowUI, value);

这三个参数的意思分别是:

  • cmd:命令文本,有好多,IE的可以看这里,Firefox的可以看这里

  • isDefaultShowUI:是否默认显示交互界面,比如加链接的时候,可以通过界面填入链接。不过这个参数存在兼容性问题,一般设为false将其禁用,并另外制作交互界面。

  • value:传入的值,某些命令可以省略。

execCommand的问题是,生成的代码可能不标准,比如在IE下,文字加粗用的是b标签而不是strong标签。

交互问题

用户不可能总是在编辑器中输入,比如加粗、插入图片等功能是通过按钮操作的。假设用户要加粗一段选中的文字,当他按了加粗按钮后,选区以及焦点也会跟着跑到那去,因此选区(选中的文字)丢失,操作也就无法完成;同理,插入图片时插入位置也会丢失。

也就是说,要保存最后出现在编辑器中的选区。我采取的方案是,当焦点在编辑器内的时候,用一个定时器(setInterval)定时获取当前选区。选区编程平时很少用,做起来也有很多兼容性问题,主要是参考微软的MSDNTextRange ControlRange)和Mozilla的MDCRange Selection)了。

回车问题

在IE下,按回车是换段落,生成<p>,但在Firefox下是换行,生成的是<br>。要解决这个问题,就要监听keydown事件,如果检测到按键是回车,就插入“<p></p>”。

获取标准的代码

如何获取编辑的内容呢?这个问题很简单,只要获取iframe页面body中的innerHTML就可以了:

var content = iframe.contentWindow.document.body.innerHTML;

然而,IE下的innerHTML非常不标准:标签名是大写的,属性没有引号包起来,单标签也没有结束符……即便是Firefox下获取的代码,也有少量瑕疵。这个时候就要用正则表达式对代码进行标准化处理。

总结

不多说了,做一遍HTML编辑器,你就会知道CKEditor是多么强大。

标签:编辑器,cms,html
0
投稿

猜你喜欢

  • Oracle性能究极优化 下

    2010-07-30 13:25:00
  • 关于设计的一些个人看法

    2008-06-12 12:44:00
  • 高性能网站建设指南:性能提升的14个原则

    2011-07-14 16:04:54
  • 兼容主流浏览器,纯CSS下拉菜单

    2010-09-05 20:30:00
  • 慎用 script 节点的 src 属性来传递参数

    2009-11-18 12:59:00
  • XMLHTTP错误The server name or address could not be resolved 的解决过程

    2009-12-26 18:33:00
  • asp获取文件md5值

    2008-10-13 09:10:00
  • XML十项特点

    2008-04-05 13:49:00
  • PL/SQL 日期时间类型函数及运算

    2009-02-26 10:45:00
  • Access创建一个简单MIS多媒体管理系统

    2008-10-13 12:31:00
  • 两大步骤教您开启MySQL 数据库远程登陆帐号

    2010-09-30 16:42:00
  • MySQL存储过程savepoint rollback to

    2008-12-03 16:02:00
  • 浅析阿里巴巴前端招聘考题

    2008-01-19 09:52:00
  • [CSS+JS]同一页面可以重复使用的选项卡

    2009-02-12 12:53:00
  • Python保存数据至MySQL时中文问题

    2011-02-23 12:06:00
  • 在ASP编程中nothing代表什么意思?

    2011-04-15 10:47:00
  • ASP截取中英文字符串固定长度

    2009-08-19 17:12:00
  • asp 自定义分段函数/求第N名成绩

    2011-03-25 11:07:00
  • 301转向和网址规范化

    2007-09-26 14:00:00
  • 平面设计人员必读

    2008-07-16 11:58:00
  • asp之家 网络编程 m.aspxhome.com