`
liss
  • 浏览: 842650 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

阅读更多

富文本编辑器,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.

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

分享到:
评论

相关推荐

    富文本编辑器

    富文本编辑器是Web开发中的重要工具,广泛应用于新闻网站后台、学校官网后台以及各种需要用户输入和编辑丰富内容的在线平台。...通过不断学习和实践,可以创建出满足各种业务场景的高质量富文本编辑器。

    仿简书富文本编辑器

    通过这个项目,开发者不仅可以学习到Android应用开发的实际技能,还可以深入理解富文本编辑器的工作原理,以及如何构建一个用户友好的编辑界面。同时,这也是对开源精神的一种实践,推动了知识和技术的共享。

    富文本编辑器源代码

    富文本编辑器是一种在网页或应用程序中用于创建和编辑带有格式化内容的文本框,...总之,这个压缩包为学习和实践富文本编辑器的开发提供了全面的材料,无论是对新手还是有经验的开发者,都能从中获得宝贵的经验和知识。

    微信小程序富文本编辑器demo源码.zip

    微信小程序富文本编辑器是一个非常...总之,通过对这个微信小程序富文本编辑器demo源码的深入学习和实践,不仅可以掌握微信小程序的基本开发技能,还能提升对富文本编辑器原理的理解,为今后的项目开发打下坚实基础。

    sdEditor富文本编辑器 v1.1.1.zip

    "sdEditor富文本编辑器 v1.1.1.zip" 是一个包含富文本编辑器相关资源的压缩包,主要用于提供用户界面友好的文本编辑功能。这个编辑器可能被用于网站内容管理、论坛发帖、博客撰写等场景,适用于网页开发和计算机应用...

    将富文本编辑器中的网络图片下载到本地

    1. **富文本编辑器的结构**:理解富文本编辑器的工作原理,它如何存储和显示内容。富文本编辑器通常会将内容保存为HTML格式,图片以`<img>`标签的形式存在,其中`src`属性指向图片的URL。 2. **网络图片的解析**:...

    135富文本编辑器

    这款编辑器以其易用性和灵活性而备受青睐,其源代码的开放,为开发者提供了一个深入理解富文本编辑器工作原理、自定义功能以及优化性能的机会。 在描述中提到的"135editor源代码"是编辑器的核心部分,包含了一系列...

    自用富文本编辑器+json对象各种互转方法

    富文本编辑器的工作原理通常是基于HTML(超文本标记语言)和CSS(层叠样式表)来展示文本的格式。编辑器内部会将用户的操作转化为HTML代码,然后通过JavaScript进行处理和传输。在保存或提交内容时,这些HTML代码...

    一款比较简单的富文本编辑器

    本篇将围绕“一款比较简单的富文本编辑器”这个主题,结合提供的标签“源码”和“工具”,深入探讨富文本编辑器的基本原理、实现方式以及常见功能。 首先,我们要理解富文本编辑器的工作机制。富文本编辑器通常基于...

    Ueditor富文本编辑器

    **Ueditor富文本编辑器详解** Ueditor是一款广泛应用于网页开发中的开源富文本编辑器,由百度公司开发并维护。它的出现极大地简化了开发者在网页上实现复杂文本编辑功能的过程,使得用户可以在网页上轻松进行文字...

    富文本编辑器 JS源码及代码示例

    富文本编辑器是一种用于网页开发的工具,它允许用户在浏览器端进行文本格式化、插入图片、链接等操作,提供了一种...通过分析和实践这些源码和示例,可以提升我们的前端开发技能,理解并掌握富文本编辑器的实现原理。

    几个富文本编辑器

    iteye是一个IT技术社区,博主"DepthJava"可能分享了一些关于如何集成、自定义或优化富文本编辑器的实践知识。 标签 "源码" 和 "工具" 提供了额外的线索。这可能意味着文章涉及到了富文本编辑器的源代码,可能是开源...

    Textricheditor轻量级富文本编辑器所见即所得

    富文本编辑器的基本功能包括: 1. **文本格式化**:用户可以对文本进行加粗、斜体、下划线、字体颜色和大小等样式调整。 2. **段落处理**:支持创建、删除段落,以及对段落进行对齐和缩进操作。 3. **列表**:提供...

    网站富文本编辑器Fckeditor在ASP.NET中应用源程序

    **正文** 富文本编辑器是Web开发中常见的一种组件,它允许用户在网页上进行类似Word的文本编辑...在不断发展的Web技术环境下,了解和掌握富文本编辑器的原理和使用方法,对于提高Web应用的开发效率和质量至关重要。

    draftail, 在为Wagtail构建的Draft.js, 上,可以配置的富文本编辑器.zip

    《draftail:基于Draft.js为Wagtail定制的富文本编辑器详解》 ...通过深入学习和实践,开发者可以充分利用draftail的潜力,打造个性化的、无障碍的富文本编辑器,进一步提升Wagtail项目的整体品质。

    XCRichEditor,安卓富文本编辑器,使用RecyclerView——安卓一号.zip

    《XCRichEditor:安卓平台上的富文本编辑器与RecyclerView结合应用详解》 在移动开发领域,尤其是在Android平台上,提供用户友好的富文本编辑功能是一个常见的需求。XCRichEditor是一个开源项目,专为Android设计,...

    JS 插件NicEdit富文本编辑器特效源码.zip

    NicEdit设计的目标是提供一个轻量级的解决方案,避免了大部分富文本编辑器的复杂性,同时保留了基本的编辑功能,如字体选择、字号调整、颜色设置等。 二、NicEdit的主要特性 1. **简单易用**:NicEdit的API简洁...

    java web文本编辑器

    Java Web文本编辑器通常基于JavaScript实现前端部分,利用AJAX技术与后台Java服务器进行交互。前端编辑器将用户的输入转化为HTML格式,并通过HTTP请求发送到服务器。服务器端的Java程序接收到HTML数据后,可以将其...

    iceEditor富文本编辑器 v1.1.9.zip

    对于学习和研究前端开发的人来说,这是一个很好的实践案例,可以深入理解富文本编辑器的实现机制。 在毕业设计或论文中引用iceEditor,可以作为构建交互式内容展示系统的一部分,展示对前端技术的掌握程度。在...

Global site tag (gtag.js) - Google Analytics