[转]富文本编辑器的基本原理与实践

from: http://realazy.org/blog/2008/05/02/rte-basis/

 

富文本编辑器的基本原理与实践

2008-05-02 05:18 JS / Dom

富文本编辑器,Rich Text Editor, 简称 RTE, 它提供类似于 Microsoft Word 的编辑功能,容易被不会编写 HTML 的用户并需要设置各种文本格式的用户所喜爱。它的应用也越来越广泛。最先只有 IE 浏览器支持,其它浏览器相继跟进,在功能的丰富性来说,还是 IE 强些。虽然没有一个统一的标准,但对于最基本的功能,各浏览器提供的 API 基本一致,从而使编写一个跨浏览器的富文本编辑器成为可能。

在很多开发者看来,富文本编辑器的编写是一件很神秘或者复杂的事情。神秘倒没有,复杂的话,确实如此。但是它的基本原理并不复杂,入门也不难。今天我们的主题是讲述基本原理,并逐步演示一个简单富文本编辑器的产生。这是我在 D2 上的一个分享内容,在台上的演讲效果不佳,固写下来,希望能够对感兴趣的读者有所帮助。

富文本编辑器的基本原理

这个原理实在是太简单了!对于支持富文本编辑的浏览器来说,其实就是设置 documentdesignMode 属性为 on 后,再通过执行 document.execCommand('commandName'[, UIFlag[, value]]) 即可。commandNamevalue 可以在 MSDN 上MDC 上找到,它们就是我们创建各种格式的命令,比方说,我们要加粗字体,执行 document.execCommand('bold', false) 即可。很简单是吧?但是值得注意的是,通常是选中了文本后才执行命令,被选中的文本才被格式化。对于未选中的文本进行这个命令,各浏览器有不同的处理方式,比方 IE 可能是对位于光标中的标签内容进行格式化,而其它浏览器不做任何处理,这超出本文的内容,不细述。同时需要注意的是,UIFlag 这个参数设置为 true 表示 display any user interface triggered by the command (if any), 在我们今天的教程中都是 false, 而 value 也只在某些 commandName 中才有,具体参考以上刚给出的两个链接。

为了不影响当前 document, 通常的做法是在页面中嵌入一个 iframe 元素,然后对这个 iframe 内的 document(通过 iframe.contentWindow.document 获得)进行操作。

十分简单,是吧?下面我们来动手做一个。

编写一个简单的富文本编辑器

这个例子使用了 YUI. 即使你对它不是很熟悉也没有关系,我在这里只使用了它的 DOM 和 Event 的一些跨平台基本方法。

搭架

在此强调一下很久未曾提及的 unobtrusive. 我们的编辑器是对 textarea 元素的一个增强(enhencement),就是说,即使 JavaScript 被禁用了,用户还可以通过 textarea 编辑内容。

在这个例子中,我们将使用 YAHOO.realazy 的命名空间,在之下实现一个 RTE 的类。我们今天的编辑器很简单,因此构造器(constructor) 的参数也只有 textarea 一个。我们使用一个实例变量来保存工具条的各个项目。实例初始化放到一个叫 render 的方法中。这一步的页面和代码见第 1 步

创建 iframe 并替换 textarea

搭好架子,正如我在前面所说,建立一个 iframe, 编辑器的所有操作都在 iframedocument 内执行。并且把 textarea 隐藏起来。从第 2 步中可以看到,我们已经有了一个 iframe, 但不能输入任何东西,很正常,我们没有打开它的 designMode 嘛。

开启 designMode

这一步涉及的东西挺多,也是关键。我们会创建获取 iframedocument 的方法,并通过程序的方式向 iframe 写入空页而非使用一个外接的 blank.html. 我们使用一个类属性 YAHOO.realazy.RTE.htmlContent 来保存空页的 html. 在准备好一切后,就可以开启 designMode 了。页面和代码详见第 3 步。看,我们已经可以在 iframe 里输入东西了。

构建工具条

我们需要操作的工具条!这样才可以控制 iframe 里的内容,才能称之为编辑器。在此我并不打算实现太多的功能,只是选择字形、字号、加粗、斜体、下划线、居左、居中、居右、超链接和插图作为示例。对于跨平台,Mozilla Midas Specification是不错的参考。ok, 请看第 4 步,我们的工具条出来了,虽然很丑。我同时用 CSS 对 iframe 的宽度做出了一些调整。

给工具条加上事件

嗯,工具条出来了,编辑器看起来也“人模狗样”了,你兴奋的点啊点,没什么效果……意料中嘛。我们接着给工具条绑定一些事件,让编辑器内容能够响应工具条。在这一步,我们把 execCommand 再封一层,前面说过,我们用不上 UIFlag,让它永远是 false 好了。好,有代码就有真相,请看第 5 步。如果是正使用 IE, 请先暂时转移到其它浏览器。看到了吧,工具条生效了!

解决 IE 的问题

well, 如果你没有听我的劝告,依然使用 IE, 你会发现除了字型和字号其它的都不能用。为什么呢?你观察一下,有没有发现,其它浏览器选择文本后,再点击工具条上的项目,被选中的文本是否依然选中的?而 IE 呢,在点击工具条时,选中的文本马上失去选中的状态,所以它们就失败了。所以,如果我们能够保证点击工具条文本保持选中状态,就可以解决 IE 的问题了。

Microsoft 给 HTML 标签一个很奇怪的属性 unselectable, 只要设置为 on, 焦点不会转移到点击的元素上,从而保证文本的选中状态。

请看第 6 步。这也是解决 IE 头痛问题的关键所在。我曾经在这上面费了很大脑筋。

高级主题展望

good, 看看我们现在的代码,224 行。相比其它动辄上万行的编辑器,你可能会觉得不可思议。因为我们这个最基本的编辑器,连 selection 都没有用到。很多很酷的效果,比如 Google Doc 里能够动态改变链接文本,使用页内层而非弹出的 prompt 来操作等高级功能,基本上都要用到 TextRange(IE) 或者 Range(W3C). 要命的是这两个东西互补兼容,只是相似而已。入门推荐看PPK 的 Introduction to Range.

在此我们就不深入了,等我有时间我会总结一些奇技淫巧(呜呼,前端开发需要的奇技淫巧太多了,这不是好事情)出来。

时间: 2025-01-31 13:53:46

[转]富文本编辑器的基本原理与实践的相关文章

iOS使用UITableView实现的富文本编辑器

本文讲的是iOS使用UITableView实现的富文本编辑器,公司最近做一个项目,其中有一个模块是富文本编辑模块,之前没做个类似的功能模块,本来以为这个功能很常见应该会有已经造好的轮子,或许我只要找到轮子,研究下轮子,然后修改打磨轮子,这件事就八九不离十了.不过,还是 too young to simple 了,有些事,还是得自己去面对的,或许这就叫做成长,感觉最近一年,对于编程这件事,更多了一点热爱,我感觉我不配过只会复制粘贴代码的人生,编程需要有挑战.所以,遇到困难,保持一份正念,路其实就在

富文本编辑器-导入百度编辑器的问题

问题描述 导入百度编辑器的问题 jsp 中导入百度编辑器没有达到需要的效果,只有一个小小的编辑框,没有可视化按钮,没有提交按钮,就那样放在左上角,下面就是显示的结果,,怎么破???? 解决方案 百度编辑器路径设置问题 解决方案二: 跟你个我以前的写的案例,你修改一下吧 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String pa

超漂亮的Bootstrap 富文本编辑器summernote_javascript技巧

 Summernote 是一个简单,灵活,所见即所得(WYSIWYG)的编辑器,基于 jQuery 和 Bootstrap 构建.Summernote 所有主要的操作都支持快捷键,有一个功能强大的 API,它提供了大量的自定义选项的设计(宽,高,有效的项目等等)和功能.对于主要的脚本语言或框架(PHP,Ruby,Django,NodeJS),该项目有提供了集成示例. Bootstrap summernote,用其官网上的介绍就是"Super Simple WYSIWYG editor"

求高手kindeditor富文本编辑器,使用源码及详解,谢谢各位,急,急,急,急,急急

问题描述 求高手kindeditor富文本编辑器,使用源码及详解,谢谢各位,急,急,急,急,急急 求高手kindeditor富文本编辑器,使用源码及详解,谢谢各位,急,急,急,急,急急 解决方案 参考:http://blog.csdn.net/thinkhlin_down/article/details/6065619http://www.poluoluo.com/jzxy/201306/214700.htmlhttp://cshbbrain.iteye.com/blog/1892698 解决方

jquery-bootstrap 富文本编辑器可以上传附件么?有没有可以上传附件的富文本编辑器

问题描述 bootstrap 富文本编辑器可以上传附件么?有没有可以上传附件的富文本编辑器 我看大多富文本编辑器只能上传图片或者视频,但有没有带上传附件的 解决方案 http://blog.csdn.net/zcs_123li/article/details/51220351

生成富文本编辑器生成内容转换成json格式,解析出错,在mysql里面用什么类型保存

问题描述 生成富文本编辑器生成内容转换成json格式,解析出错,在mysql里面用什么类型保存 富文本怎么保存?保存在mysql里面用什么样的类型,还有就是能够获取到富文本的内容(包括标签什么的),用json怎么转换,用过转义也不行?求助啊!!!!

手机端--富文本编辑器

问题描述 各位大神,手机端想弄一个富文本编辑器,有没有好的推荐:不是安卓...是基于浏览器的[有过成功经验的大虾,给点提示,,,谢谢] 解决方案 解决方案二:先从业务角度把东西想明白.在手机上弄一个Html编辑器,进行十几.二十几项编辑,如何操作?用手指头吗?先把这个业务设计出来,才好找实现.解决方案三:需求挺逗解决方案四: 解决方案五:楼上更逗,人家需求怎么就逗了?手机端富文本编辑器很多场景都有需求解决方案六:百度的富文本编辑器ueditor,之前用了还不错.解决方案七:没看清是手机端使用.手

web 富文本编辑器总结

前言 富文本编辑器,就是除了能输入不同的文本之外,还可以之间粘贴图画等其他的多媒体信息.也可说是所见即所得的编辑器. 目前可以使用的编辑器有很多, 在网络上有找到这样一份比较表格: 编辑器 产地 稳定 是否 轻量 技术 支持 主要优点 主要不足 Ver 速度 肥瘦 (MB) CKEditor 国外老牌 稳定 否 团队 功能强大,稳定 臃肿,加载慢 3.6 4 0.90 KindEditor 国产(上海-浩跃软件)   轻量   插件扩展   4.0 2 0.24 xhEditor 国产(台州-[

baidu富文本编辑器上传图片尺寸控制

问题描述 baidu富文本编辑器上传图片如何控制尺寸控? 解决方案 解决方案二:富文本一般是有预览的.富文本已经是一个封装的控件,上传的图片是作为二进制的流存储在富文本内容中的.你本身是没有办法去修改富文本中的操作的.解决方案三:不好控制已封装好的二进制流,就不如在将图片存入富文本环节加以控制